据我所知,有三种方法可以找出对象是否为数组
通过isArray
函数实现
Array.isArray()
toString
Object.prototype.toString.apply( obj ) === "[object Array]"
和instanceof
obj instanceof Array
有没有理由选择其中一个?
答案 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(并验证它不是函数),然后才决定它应该像数组一样迭代。
如果这不是您要解决的问题,我可以找到两个使用第一种技术的参考:
答案 3 :(得分:1)
instanceof
测试给定的构造函数(Array)是否在对象的原型链中,而第二种方法只检查对象的实际类型。换句话说,如果您的对象继承自Array,则第二个测试将为true,但第一个将为false。现在,通常不会从Array继承(它在IE中无法正常工作),但是走原型链可能会增加一些开销(特别是如果对象不是数组)。