使用Array.isArray和instanceof Array之间的区别

53 javascript arrays

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

解决方案1:

Array.isArray(item);
Run Code Online (Sandbox Code Playgroud)

解决方案2:

item instanceof Array;
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

Rob*_*obG 63

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

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

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

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

"优选"假设一些选择标准.通常,首选方法类似于:

if (Object.prototype.toString.call(obj) == '[object Array]')
Run Code Online (Sandbox Code Playgroud)

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

3.哪个处理时间更快?

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

if (!Array.isArray) {
    Array.isArray = function(obj) {
      return Object.prototype.toString.call(obj) == '[object Array]';
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但我可以说,即使在“==”和“===”相同的情况下,仍然必须使用后者。我的意思是,我们不会根据我们认为适合的地方选择性地选择安全指南。我们把它们放在各处以形成一种习惯,以防万一忘记某些事情,以防我们认为不会发生的情况或任何愚蠢的事情发生。**选择性地采用好的做法并不是好的做法,它们应该到处应用或者根本不使用它们。** (3认同)
  • @RobG,Eksapsy 以“我可以争论”开头,那么为什么要关注他对“必须”这个词的使用呢?不过,你声明“没有证据”......当你在`==`/`===`上找到的每一个该死的资源都谈到`==`的歧义性时,你所说的“证据”是什么意思?怎么是运算符的语言错误。“**人们受到该死的东西影响**”这对你来说不是证据吗?只要说“我不明白怎么办”而不是“没有证据表明”,会让你看起来不那么无礼...... (3认同)
  • 三重等于`===`不是更可靠吗? (2认同)
  • @vad-不。* Object.prototype.toString *始终返回字符串,因此`==`和`===`的结果相同。 (2认同)
  • @CertainPerformance—当然,但以上仅建议在 *Array.isArray* 不可用的情况下使用 pollyfill,不包括 ECMAScript 2015(在 ES5 和 *isArray* 之后 4 年引入)及更高版本。 (2认同)
  • > “基本上不相关,因为两者的处理时间都可以忽略不计。” 这取决于您调用这些方法的程度。在某些情况下,例如游戏性能非常重要。 (2认同)

Bri*_*ark 29

  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    
    
    Run Code Online (Sandbox Code Playgroud)

    正如您在上面的示例中所看到的,使用时,iframe(ie array2)中使用Array构造函数创建的数组不会被识别为数组instanceof Array.但是,它在使用时被正确识别为数组Array.isArray().

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

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

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

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

  3. 哪个处理时间更快?

    根据这个jsperf,instanceof Array比快Array.isArray().这是有道理的,因为Array.isArray()执行更强大的检查,因此受到轻微的性能影响.

  • 刚刚遇到这个并且想要注意,某些浏览器中的`Array.isArray()`现在比`instanceof Array`快得多 (7认同)