js中我们常用的判断类型方法typeof在对象和数组上都返回'object',所以要使用其他方案来判断
第一种方法,判断对象的长度
var a = [];
var b = {};
a.length; // 0
b.length; // undefined
然而,因为对象的属性可以被修改,所以这种方法并不可靠;但是因为let等会计作用域的保证,所以这个方法是开发中比较简单常用的方法;
第二种方法,instanceof
var a = [];
var b = {};
a instanceof Array; // true
b instanceof Array; // false
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object的原型链上。
换句话来说,就是检测参数a的原型链上是否存在Array的的原型;
理解这个方法可以了解下mdn上关于Object.getProtoTypeOf的解释
JavaScript中的 Object 是构造函数(创建对象的包装器)。
一般用法是:
var obj = new Object();
所以:
Object.getPrototypeOf( Object ); // ƒ () { [native code] }
Object.getPrototypeOf( Function ); // ƒ () { [native code] }
Object.getPrototypeOf( Object ) === Function.prototype; // true
Object.getPrototypeOf( Object )是把Object这一构造函数看作对象,
返回的当然是函数对象的原型,也就是 Function.prototype。
正确的方法是,Object.prototype是构造出来的对象的原型。
var obj = new Object();
Object.prototype === Object.getPrototypeOf( obj ); // true
Object.prototype === Object.getPrototypeOf( {} ); // true
第三种方法,Object.prototype.toString.call()
var a = [];
var b = {};
b.toString(); // "[object Object]"
Object.prototype.toString.call(a); // "[object Array]"
Object.prototype.toString.call(b); // "[object Object]"
那么问题来了,为什么要使用Object.prototype.toString来帮助判断,不直接用toString?其实是为了防止自定义的toString方法导致返回的结果被修改。
每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。
第四种方法,Array.isArray()
var a = [];
var b = {};
Array.isArray(a); // true
Array.isArray(b); // false
Array是ES6推出的方法,在可以使用ES6的环境下,提供了简单好用的array判断方法!
严格判定JavaScript对象是否为数组
js中我们常用的判断类型方法typeof在对象和数组上都返回'object',所以要使用其他方案来判断
第一种方法,判断对象的长度
然而,因为对象的属性可以被修改,所以这种方法并不可靠;但是因为let等会计作用域的保证,所以这个方法是开发中比较简单常用的方法;
第二种方法,instanceof
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object的原型链上。
换句话来说,就是检测参数a的原型链上是否存在Array的的原型;
理解这个方法可以了解下mdn上关于Object.getProtoTypeOf的解释
第三种方法,Object.prototype.toString.call()
那么问题来了,为什么要使用Object.prototype.toString来帮助判断,不直接用toString?其实是为了防止自定义的toString方法导致返回的结果被修改。
每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。
第四种方法,Array.isArray()
Array是ES6推出的方法,在可以使用ES6的环境下,提供了简单好用的array判断方法!
严格判定JavaScript对象是否为数组