有两种方法可以确定数组是数组还是对象。使用typeof item === "object";
将为对象和数组返回true,因为数组对于javascript是相对较新的,而数组是对象的原型(可能措辞错误,请随意纠正我)。因此,我知道确定数组是否为数组的两种方式是:
解决方案1:
Array.isArray(item);
解决方案2:
item instanceof Array;
我的问题是:
答案 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)
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上详细了解它。
这两个中哪一个是首选解决方案?
在大多数情况下,instanceof Array
应该足够了。但是,由于instanceof Array
在iframes
/ window
内无效,Array.isArray()
将是更强大的解决方案。
请务必检查浏览器兼容性。如果您需要支持IE 8或更低版本,Array.isArray()
将无效(请参阅Mozilla's doc)。
哪个处理时间更快?
根据此jsperf,instanceof Array
比Array.isArray()
快。这是有道理的,因为Array.isArray()
执行更强大的检查,因此会受到轻微的性能影响。