什么是找出对象是否是数组的最佳方法

时间:2011-09-16 15:58:14

标签: javascript

据我所知,有三种方法可以找出对象是否为数组

通过isArray函数实现

Array.isArray()

toString

Object.prototype.toString.apply( obj ) === "[object Array]"

instanceof

obj instanceof Array

有没有理由选择其中一个?

4 个答案:

答案 0 :(得分:6)

最好的方法可能是使用标准Array.isArray(),如果它由引擎实现:

isArray = Array.isArray(myObject)

MDN建议在toString()未实施时使用Array.isArray方法:

  

兼容性

     

在创建任何其他代码之前运行以下代码   Array.isArray如果它本身不可用。这取决于   Object.prototype.toString保持不变并调用解析   原生Function.prototype.call方法。

if(!Array.isArray) {  
  Array.isArray = function (arg) {  
    return Object.prototype.toString.call(arg) == '[object Array]';  
  };  
}

jQuery和underscore.js[source]都采用toString() === "[object Array]"方式。

答案 1 :(得分:1)

除非事实证明前者具有显着的性能优势且我的应用程序需要每一个最后一盎司的速度,否则我会选择后者。

原因是可读性,纯粹而简单。

答案 2 :(得分:1)

如果您要做的是确定传递给您的参数是否是您应该迭代的数组,那么有相当数量的代码只能查找.length属性并对待如果存在该属性,则为数组或伪数组。

这是因为有很多东西实际上不是数组(但是具有类似数组的伪数组),您可能希望代码像数组一样对待。其中一些例子是jQuery对象或从许多DOM调用返回的nodeList。这是一个代码示例:

// accepts:
//    single DOM element
//    array of DOM elements
//    nodeList as returned from various DOM functions like getElementsByClassName
//    any array like object with a .length attribute and items in numeric indexes from 0 to .length-1 like a jQuery object
function hideElements(input) {
    if (input.length !== undefined) {
        for (var i = 0, len = input.length; i < len; i++) {
            input[i].style.display = "none";
        }
    } else {
        input.style.display = "none";
    }
    return(input);
}

jQuery .each()函数也只是测试传递给它的参数为.length(并验证它不是函数),然后才决定它应该像数组一样迭代。

如果这不是您要解决的问题,我可以找到两个使用第一种技术的参考:

  1. jQuery的isArray实现使用第一种技术。
  2. MDN(Mozilla开发者网络)建议使用第一个here

答案 3 :(得分:1)

instanceof测试给定的构造函数(Array)是否在对象的原型链中,而第二种方法只检查对象的实际类型。换句话说,如果您的对象继承自Array,则第二个测试将为true,但第一个将为false。现在,通常不会从Array继承(它在IE中无法正常工作),但是走原型链可能会增加一些开销(特别是如果对象不是数组)。