数组元素与属性?

Man*_*tar 1 javascript

所以要跟进前一个问题;

由于使用属性和迭代的动态功能

for(var key in array)
Run Code Online (Sandbox Code Playgroud)

我已经相当多地使用它来支持尝试枚举数组并按数字迭代.

仅仅.pushing元素和设置为属性的专业和缺点是什么?

除了明显的识别差异之外.

Ivo*_*zel 7

简而言之:
永远不要for in在阵列上使用,它极其缓慢且容易出现故障.

说明

好吧,虽然Array在JavaScript中是一个Object,但没有充分的理由使用for in循环来迭代它.事实上,有一些很好的理由反对使用for inArray.

虽然起初看起来似乎是一个不错的选择,但是要将某种速度与for in构造的可读性进行交换,这对性能有重大影响.

for in事实上叠代的指标呢Array.但它也会遍历原型链.因此,必须使用hasOwnProperty以确保过滤掉不需要的属性,并且如果在阵列上碰巧定义了任何其他属性,它们仍将通过此过滤器.

Array.prototype.bar = 1; // poisoning the Object.prototype, NEVER do this
var foo = [1, 2, 3];
for(var i in foo) {
    console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

在"索引"上面的代码的结果0,1,2 bar被打印出来.

使用hasOwnProperty进行过滤

Array.prototype.bar = 1; // poisoning the Object.prototype, NEVER do this
var foo = [1, 2, 3];
foo.blub = 2;
for(var i in foo) {
    if (foo.hasOwnProperty(i)) {
        console.log(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码结果现在打印"指标" 0,1,2 blub,你不能过滤掉blub任何有意义的方式,除非您验证的关键是一个正整数.

性能

现在,将原型遍历的慢速性质for in与使用hasOwnProperty结果相结合,性能降低了20倍.

因此,如果您想Array在JavaScript中进行迭代,请始终使用经典for循环结构.

var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
    console.log(list[i]);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,上面的示例中还有一个额外的问题.这是长度的缓存l = list.length.

虽然length属性是在数组本身上定义的,但在每次迭代中进行查找仍然存在开销.虽然最近的JavaScript引擎可能会在这种情况下应用优化,但是人们永远无法确定这些优化是否真正到位,也无法确定它们是否达到了上述缓存的速度.事实上,省略缓存可能导致性能下降高达2倍(在旧引擎中甚至更多).