关于javascript:使用Array.isArray和instanceof Array之间的区别

Difference between using Array.isArray and instanceof Array

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

解决方案1:

1
Array.isArray(item);

解决方案2:

1
item instanceof Array;

我的问题是:

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

  • 1.What is the difference between these two solutions?

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

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

    2.Which of these two is the preferred solution?

    "首选"假设一些选择标准。通常,首选方法如下:

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

    它适合ES3浏览器并跨帧工作。如果只考虑ES5浏览器,isarray可能是正常的。

    3.Which has a faster process time?

    基本上不相关,因为两者的处理时间可以忽略不计。更重要的是选择一个可靠的。可以将array.isarray方法添加到没有内置该方法的浏览器中—使用:

    1
    2
    3
    4
    5
    if (!Array.isArray) {
        Array.isArray = function(obj) {
          return Object.prototype.toString.call(obj) == '[object Array]';
        }
    }


  • Array.isArray(item)item instanceof Array的区别

    正如FelixKling在评论中提到的,instanceof Array在iframes中不起作用。要给出一个特定的示例,请尝试以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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

    如上例所示,使用iframe中的数组构造函数(即array2创建的数组)在使用instanceof Array时不被识别为数组。但是,在使用Array.isArray()时,它被正确地标识为一个数组。

    如果你想知道为什么instanceof Array不能在不同的全球范围内工作(即iframewindow),你可以在这里阅读更多关于它的信息。

  • 这两个方案中哪一个是首选方案?

    在大多数情况下,instanceof Array就足够了。然而,由于instanceof Arrayiframeswindow之间不能正常工作,Array.isArray()将是更为可靠的解决方案。

    不过,一定要检查浏览器的兼容性。如果您需要支持IE8或更低版本,Array.isArray()将无法工作(请参阅Mozilla的文档)。

  • 哪个处理时间更快?

    根据这个JSperf,instanceof ArrayArray.isArray()快。这是有道理的,因为Array.isArray()执行更强大的检查,因此会对性能造成轻微影响。