JS 判断对象是不是数组
前端面试或笔试经典题目之一——判断对象/数组
一、用 instanceof 操作符判断
instanceof运算符可以用来判断某个构造函数的prototype属性所指向的对象是否存在于另外一个要检测对象的原型链上
1 | const a = []; |
注意:instanceof操作符的问题在于,它假定只有一个全局环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。
如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。
二、用对象的 constructor 属性判断
实例化的数组拥有一个constructor属性,这个属性指向生成这个数组的方法
1 | const a = []; |
注意: constructor属性是可以被重写的 。 constructor属性一旦被修改,就不能确保一定是数组 。因此, 这种方法来判断数组是不靠谱的 。
三、用 Object.prototype.toString 判断
每一个继承自Object的对象都拥有
toString的方法
使用call或者apply方法来改变toString方法的执行上下文
1 | const a = [] |
四、用 Array.isArray()判断
Array.isArray() 用于确定传递的值是否是一个数组
1 | const a = []; |
目前所有主流浏览器和IE9+都对其进行了支持,IE8及以下浏览器不支持该方法
Polyfill—— 假如不存在 Array.isArray(),则在其他代码之前运行下面的代码将创建该方法。
1 | if (!Array.isArray) { |