在开始前先创建三个对象
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
直接返回布尔值,不用加等号