判断是不是数组问题(arr.constructor === Array)

新手上路,请多包涵
let arr = [1, 2, 3]
console.log(arr.constructor === Array)

上面代码的输出结果是 true。
根据原型链
image

不应该是

console.log(arr.__proto__.constructor === Array)

为什么 arr.constructor === Array 的返回结果也是 true 呢?

阅读 3.9k
3 个回答

判断是否为数组推荐使用Array.isArray()

instanceof在使用iframe的时候失效是因为iframe有独立的window。这是MDN的例子:

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray(1,2,3); // [1,2,3]

// Correctly checking for Array
Array.isArray(arr);  // true
// Considered harmful, because doesn't work though iframes
arr instanceof Array; // false

但是以下判断还是有效的:

arr instanceof xArray

arr本身没有constructor属性
image.png

但是使用arr.constructor的时候会根据原型链查找,所以此时arr.constructor等于arr.__proto__.constructor

image.png


判断是否为数组推荐使用instanceof

@鸿则说的关于 constructor 的部分是对的。

但判断不应该用 instanceof,而是要用 Array.isArray()

即便出于兼容不支持 ES6 的浏览器,也应该用 if (Object.prototype.toString.call(obj) === '[object Array]') 的方式。

constructor和instance of因为prototype可以修改不一定准确 直接使用isArray()

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏