判断一个对象是不是数组类型的六种不同方法

在很多时候我们需要去判断一个对象是不是数组类型有以下六种方法,

在判断是时候是不可以使用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
)
  1. typepf可以用来判断原始类型,但是不可以用来判断引用类型对象的具体类型,对象和数组都是引用类型的对象
    因为null经常用于释放一个变量对对象的应用,用来代替对象的地址,所以null在用法上是一个没意义的对象
  2. **obj1={} **是obj=new object{}的简写所以原型对象是object
  3. obj2=[]是obj2=new Array()的简写所以原型对象是Array
    所以可以用_ _proto__获得原型对象。和数组的原型对象比较
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)
)

第一次写,如果有不足之处希望大佬们见谅,如果有错可以联系我即是更改。谢谢各位读者。

你可能感兴趣的:(javascript)