使用 Array.isArray 和 instanceof Array 的区别

IT技术 javascript arrays
2021-03-05 06:43:14

有两种方法可以确定数组是数组还是对象。typeof item === "object";对于对象和数组,使用将返回 true,因为数组对于 javascript 来说相对较新,而数组是对象的原型(可能措辞有误,请随时纠正我)。因此,我知道的确定 Array 是否为 Array 的两种方法是:

解决方案1:

Array.isArray(item);

解决方案2:

item instanceof Array;

我的问题是:

  1. 这两种解决方案有什么区别?
  2. 这两个中哪一个是首选解决方案?
  3. 哪个处理时间更快?
2个回答

1.这两种解决方案有什么区别?

isArray是一种 ES5 方法,因此旧浏览器不支持,但它可靠地确定对象是否为数组。

instanceof只检查Array.prototype是否在对象的[[Prototype]]链上。它在跨帧检查数组时失败,因为用于实例Array构造函数可能与用于测试的构造函数不同。

2.这两个中哪个是首选解决方案?

“首选”假定了一些选择标准。一般来说,首选的方法是这样的:

if (Object.prototype.toString.call(obj) == '[object Array]')

它适合 ES3 浏览器并跨框架工作。如果只考虑 ES5 浏览器,isArray可能没问题。

3.哪个处理时间更快?

很大程度上无关,因为两者的处理时间都可以忽略不计。更重要的是选择一个可靠的。一个Array.isArray方法可以被添加到没有它内置的浏览器中使用:

if (!Array.isArray) {
    Array.isArray = function(obj) {
      return Object.prototype.toString.call(obj) == '[object Array]';
    }
}
@CertainPerformance—当然,但以上仅建议在Array.isArray不可用的情况下使用 pollyfill,不包括 ECMAScript 2015(在 ES5 和isArray之后 4 年引入)及更高版本。
2021-04-18 06:43:14
> “基本上不相关,因为两者的处理时间都可以忽略不计。” 这取决于您调用这些方法的程度。在某些情况下,例如游戏性能非常重要。
2021-04-24 06:43:14
请注意,在 ES6+ 中,一个对象可能会给自己一个自定义toStringTag结果,[object Array]尽管它实际上并不是一个数组。我不确定是否可以使用完全可靠的 polyfillArray.isArray
2021-05-08 06:43:14
@vad——不。Object.prototype.toString总是返回一个字符串,所以对结果=====是相同的。
2021-05-09 06:43:14
三重等于===不是更可靠吗?
2021-05-12 06:43:14
  1. Array.isArray(item)之间的区别item instanceof Array

    正如 Felix Kling 在评论中提到的,instanceof Array不适用于 iframe。给你一个具体的例子,试试下面的代码:

    var iframeEl = document.createElement('iframe');
    document.body.appendChild(iframeEl);
    iframeArray = window.frames[window.frames.length - 1].Array;
    
    var array1 = new Array(1,1,1,1);
    var array2 = new iframeArray(1,1,1,1);
    
    console.log(array1 instanceof Array);  // true    
    console.log(Array.isArray(array1));  // true
    
    console.log(array2 instanceof Array);  // false    
    console.log(Array.isArray(array2));  // true    
    

    正如您在上面的示例中看到的array2那样,当您使用instanceof Array. 但是,在使用Array.isArray().

    如果您想知道为什么instanceof Array在不同的全局变量(即iframewindow)中不起作用,您可以在此处阅读更多相关信息

  2. 这两个中哪一个是首选解决方案?

    大多数情况下instanceof Array应该足够了。但是,由于instanceof Array不能在iframes/ 上正常工作window,因此Array.isArray()将是更强大的解决方案。

    不过,请务必检查浏览器兼容性。如果您需要支持 IE 8 或更低版本,Array.isArray()则无法使用(请参阅Mozilla 的文档)。

  3. 哪个处理时间更快?

    根据这个jsperfinstanceof ArrayArray.isArray(). 这是有道理的,因为Array.isArray()执行更健壮的检查,因此性能受到轻微影响。

刚刚遇到这个问题,并想指出,Array.isArray()在某些浏览器中,现在明显快于instanceof Array
2021-04-29 06:43:14