使用Array.isArray和instanceof Array的区别

问题描述 投票:0回答:2

有两种方法可以判断一个数组是数组还是对象。使用

typeof item === "object";
将为对象和数组返回 true,因为数组对于 javascript 来说相对较新,并且数组是对象的原型(可能用词错误,请随时纠正我)。所以我知道的判断数组是否是数组的两种方法是:

解决方案1:

Array.isArray(item);

解决方案2:

item instanceof Array;

我的问题是:

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

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]';
    }
}

47
投票
  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
    时,在 iframe 中使用 Array 构造函数创建的数组(即
    instanceof Array
    )不会被识别为数组。但是,使用
    Array.isArray()
    时,它会被正确识别为数组。

    如果您有兴趣了解为什么

    instanceof Array
    不适用于不同的全局变量(即
    iframe
    window
    ),您可以在 here 上阅读更多相关信息。

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

    在大多数情况下

    instanceof Array
    应该足够了。但是,由于
    instanceof Array
    无法在
    iframes
    /
    window
    上正常工作,因此
    Array.isArray()
    将是更稳健的解决方案。

    请务必检查浏览器兼容性。如果您需要支持 IE 8 或更低版本,

    Array.isArray()
    将不起作用(请参阅 Mozilla 的文档)。

  3. 哪个处理时间更快?

    根据这个jsperf

    instanceof Array
    Array.isArray()
    更快。这是有道理的,因为
    Array.isArray()
    执行更稳健的检查,因此性能会受到轻微影响。

© www.soinside.com 2019 - 2024. All rights reserved.