在判断是时候是不可以使用typeof的
下面是一组定义好的变量
,分别代表不同类型。
var n=10,str="hello",b=true,nu=null,un;
var foo = funcrion(){};
var obj={},0bj2=[1,2,3],obj=new Date();
下面我们用typeof查看下类型
console.log(
typeof(n),//number
typeof(str),//string
typeof(b),//boolean
typeof(nu),//object
typeof(un),//undefined
typeof(f),//function
typeof(obj1),//object
typeof(obj2),//object
typeof(obj3),//object
)
console.log(
obj1.__proto__==Array.prototype,//false
obj2.__proto__==Array.prototype,//true
obj3 .__proto__==Array.prototype//false
)
所以obj2是数组
因为__proto__可能被浏览器禁用,所以有等效函数完成__proto的任务,也就是第二种方法Object.getprototypeOf()
console.log(
Object.getprototypeOf(obj1)==Array.prototype,//false
Object.getprototypeOf(obj2)==Array.prototype,//true
Object.getprototypeOf(obj3)_==Array.prototype//false
)
除此之外还有一个更加直接的函数father.isPrototypeOf(),也就是第三种办法
这个函数等效于上边的函数
console.log(
Array.prototype.isPrototypeOf(obj1),//false
Array.prototype.isPrototypeOf(obj2),//true
Array.prototype.isPrototypeOf(obj3)//false
)
用父级原型对象的constructor属性也可用来判断,第四种办法
console.log(
obj1.constructor==Array,//false
obj2.constructor==Array,//true
obj3.constructor==Array//false
)
第五种办法
使用 instanceof 来判断是不是数组
console.log(
obj1 instanceof Array,//false
obj2 instanceof Array,//true
obj3 instanceof Array,//false
)
第六种办法
class属性,在创建对象时候自带的内部属性,记录了在创建时的引用类型,所以obj1的class=object,obj2的class=Array,obj3的class=Date,不过想要输出class的内部属性,需要调用到顶级原型对象中的tostring,
这个时候需要使用.call() 这个函数可以使对象调用它本身没有的函数
console.log(
Object.prototype.toString.call(obj1),//[Object,Object]
Object.prototype.toString.call(obj2),//[Object,Array]
Object.prototype.toString.call(obj3)//[Object,Date]
)
所以,当
Object.prototype.toString.call(obj2)=='[Object,Date]'
这种方法是最合适的
在ES5中封装了判断是不是数组的函数isArray,本质就是封装的第上面第六种方法
console.log(
Array.isArray(obj1),
Array.isArray(obj2),
Array.isArray(obj3)
)
第一次写,如果有不足之处希望大佬们见谅,如果有错可以联系我即是更改。谢谢各位读者。