js中判断对象是否为数组的几种方式

在开始前先创建三个对象

var obj1={},
var obj2=[1,2,3],
var obj3=new Date();

分别是普通对象,数组对象和日期对象

第一种方法

用双下划线proto获取对象的原型对象再与数组的原型对象作比较,返回ture为数组,false则不是

console.log(
  obj1.__proto__==Array.prototype, //false
  obj2.__proto__==Array.prototype, //true
  obj3.__proto__==Array.prototype //false
);

第二种方法

因为双下划线proto可能会被浏览器禁用,所以有等效的函数Object.getPrototypeof来替代proto的作用

console.log(
Object.getPrototypeof(obj1)==Array.prototype, //false
Object.getPrototypeof(obj2)==Array.prototype, //true
Object.getPrototypeof(obj3)==Array.prototype //false
);

第三种方法

js还有一个更直接的函数 father.isPrototypeof(child)

翻译成人话就是数组的原型对象是obj1的原型对象么,会返回一个布尔值,
与以上两种方法相同,返回ture为数组,false则不是

console.log(
Array.prototype.isPrototypeof(obj1), //false
Array.prototype.isPrototypeof(obj2), //true
Array.prototype.isPrototypeof(obj3) //false
);

以上三种方式都是从对象的原型对象角度去判断

第四种方法

使用JavaScript原型对象里的 constructor 属性

对象会继承原型对象的constructor 属性,所以可以用此属性找到对象的构造函数
再根据构造函数来判断是否该对象为数组对象

consolo.log(
 obj1.constructor==Array, //false
 obj2.constructor==Array, //true
 obj3.constructor==Array //false
);

第五种方法

instanceof 实例

用{}创建对象是new Object的简写

用[]创建对象则是new Array的简写

所以new出来的obj2则为Array(数组对象)的一个实例
所以可以用instanceof 实例进行判断

consolo.log(
 obj1 instanceof ==Array, //false
 obj2 instanceof==Array, //true
 obj3 instanceof==Array //false
);

第六种方式(推荐)

因为前几种方式都存在一定的缺陷
比如

obj1.__proto__=Array.prototype

则在控制台查看obj1都会是ture
而第六种则不会,在每个对象创建时都会有一个隐藏的值类型,用对象名加点访问不到
Object对象和它的原型链上各自有一个toString()方法,第一个返回的是一个函数,第二个返回的是值类型。
所以任何对象可以使用call()去使用Object.toString的函数

console.log(
Object.prototype.toString.call(obj1), // 输出[object Object]
Object.prototype.toString.call(obj2), // 输出[object Array]
Object.prototype.toString.call(obj3) // 输出[object Date]
);

只要跟输出结果相比较就可以得出布尔值

console.log(
Object.prototype.toString.call(obj1==="[object Array]") //fasle
Object.prototype.toString.call(obj2==="[object Array]") //true
Object.prototype.toString.call(obj3==="[object Array]") //false
);

第七种

其实在es5中新增了一个专门判断一个对象是不是数组的一个函数

Array.isArray(obj1), //false
Array.isArray(obj2), //true
Array.isArray(obj3) //false

直接返回布尔值,不用加等号

你可能感兴趣的:(js中判断对象是否为数组的几种方式)