⼀、typeof判断数据类型(判断数组跟对象都返回object)
console.log(typeof null); // \"object\"console.log(typeof function () {return 1;
}); // \"function\"
console.log(typeof '梦龙⼩站'); // \"string\"console.log(typeof 1); // \"number\"console.log(typeof a); // \"undefined\"
console.log(typeof undefined); // \"undefined\"console.log(typeof []); // \"object\" console.log(typeof NaN); // \"number\" console.log(typeof {}); // \"object\"
⼆、instanceof判断对象的原型链是否是指向构造函数的prototype
var arr = [1,2,3,1];
console.log(arr instanceof Array)//true
三、对象的constructor属性
var arr = [1,2,3,1];
console.log(arr.constructor === Array)//true
四、Object.prototype.toString.call(arr)
利⽤对象的toString可以准确判断是什么类型,call()改变this指向,这⾥是借⽤Object的⽅法,然后有⼈可能会问为什么不直接⽤arr.toString⽽要借⽤Object的⽅法, 我们看下⾯
console.log(Object.prototype.toString.call(\"jerry\"));//[object String]console.log(Object.prototype.toString.call(12));//[object Number]console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: \"jerry\//[object Object]console.log(Object.prototype.toString.call(function(){}));//[object Function]console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]console.log(Object.prototype.toString.call(/\\d/));//[object RegExp]
console.log(Object.prototype.toString.call(new Person));//[object Object]
直接⽤toString
console.log(\"jerry\".toString());//jerryconsole.log((1).toString());//1console.log([1,2].toString());//1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)console.log(function(){}.toString());//function (){}console.log(null.toString());//error
console.log(undefined.toString());//error
因为toString为Object原型上的⽅法,⽽Array、Function都是Object的实例,实例重新改写了原型上的toString⽅法,不同的对象调⽤toString⽅法,调⽤的是改写之后的⽅法
(转成各种类型的字符串),⽽不会调⽤Object原型上的toString()⽅法,因此直接调⽤不能判断对象类型
var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty(\"toString\"));//trueconsole.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性console.log(Array.prototype.hasOwnProperty(\"toString\"));//falseconsole.log(arr.toString());//\"[object Array]\"
我们可以看到,删除实例上的toString⽅法后调⽤的是Object原型上的toString()⽅法,返回对象类型五、es6的⽅法——Array.isArray()
Array.isArray([]) //true
六、看好多博客说⽤length判断,这个其实不准确
var obj={a:1}var arr = []
console.log(obj.length)//undefinedconsole.log(arr.length)//0obj.length = 1
console.log(obj.length)//1
对象可以直接添加length这个属性,就⽆法区分了
因篇幅问题不能全部显示,请点此查看更多更全内容