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

时间:2014-03-09 23:36:06

标签: javascript arrays

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

解决方案1:

Array.isArray(item);

解决方案2:

item instanceof Array;

我的问题是:

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

2 个答案:

答案 0 :(得分:57)

  

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

答案 1 :(得分:24)

  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不适用于不同的全局变量(即iframewindow),您可以在here上详细了解它。

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

    在大多数情况下,instanceof Array应该足够了。但是,由于instanceof Arrayiframes / window内无效,Array.isArray()将是更强大的解决方案。

    请务必检查浏览器兼容性。如果您需要支持IE 8或更低版本,Array.isArray()将无效(请参阅Mozilla's doc)。

  3. 哪个处理时间更快?

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