53 javascript arrays
有两种方法可以确定数组是数组还是对象.typeof item === "object";
对于对象和数组,using 将返回true,因为数组对于javascript来说是相对较新的,而数组是对象的原型(可能措辞错误,请随意纠正我).因此,我所知道的确定数组是否为数组的两种方式是:
解决方案1:
Array.isArray(item);
Run Code Online (Sandbox Code Playgroud)
解决方案2:
item instanceof Array;
Run Code Online (Sandbox Code Playgroud)
我的问题是:
Rob*_*obG 63
1.这两种解决方案有什么区别?
isArray是一种ES5方法,因此旧浏览器不支持,但它可靠地确定对象是否为数组.
instanceof仅检查 Array.prototype是否在对象的[[Prototype]]
链上.在跨帧检查数组时失败,因为用于实例的 Array构造函数可能与用于测试的 Array构造函数不同.
2.这两个中哪一个是首选解决方案?
"优选"假设一些选择标准.通常,首选方法类似于:
if (Object.prototype.toString.call(obj) == '[object Array]')
Run Code Online (Sandbox Code Playgroud)
适合ES3浏览器并跨框架工作.如果只考虑ES5浏览器,isArray可能没问题.
3.哪个处理时间更快?
很大程度上无关紧要,因为两者的处理时间可以忽略不计.选择一个可靠的更为重要.一个Array.isArray方法可以被添加到没有它内置的浏览器中使用:
if (!Array.isArray) {
Array.isArray = function(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}
}
Run Code Online (Sandbox Code Playgroud)
Bri*_*ark 29
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
Run Code Online (Sandbox Code Playgroud)
正如您在上面的示例中所看到的,使用时,iframe(ie array2
)中使用Array构造函数创建的数组不会被识别为数组instanceof Array
.但是,它在使用时被正确识别为数组Array.isArray()
.
如果您有兴趣知道为什么instanceof Array
不能在不同的全局变量(即iframe
或window
)中起作用,您可以在此处阅读更多相关信息.
这两个中的哪一个是首选解决方案?
在大多数情况下instanceof Array
应该足够了.但是,由于instanceof Array
无法在iframes
/中正常工作window
,因此Array.isArray()
将是更强大的解决方案.
请确保检查浏览器兼容性.如果您需要支持IE 8或更低版本,Array.isArray()
则无法使用(请参阅Mozilla的文档).
哪个处理时间更快?
根据这个jsperf,instanceof Array
比快Array.isArray()
.这是有道理的,因为Array.isArray()
执行更强大的检查,因此受到轻微的性能影响.