为什么javascript中的for-in速度慢?

pat*_*ick 7 javascript

我曾在几个地方,对于-in循环比遍历数组......虽然我明白,在的sizeof前进相比,后面的场景无论发生什么事来遍历一个对象的关键点(类型)块是几乎不费吹灰之力慢阅读,我仍然很好奇,究竟是什么原因,它是如此缓慢......

它是否必须执行反向哈希函数来获取密钥,而且该过程是什么慢?

T.J*_*der 5

对于任何特定引擎,这个问题的真正答案可能取决于该引擎的实现。(如果有的话,差异的大小也会如此。)

然而,也存在不变量。例如,考虑:

var obj = {a: "alpha", b: "beta"};
var name;
for (name in obj) {
    console.log(obj[name]);
}

var arr = ["alpha", "beta"];
var index;
for (index = 0; index < arr.length; ++index) {
    console.log(arr[index]);
}
Run Code Online (Sandbox Code Playgroud)

在 的情况下obj,引擎必须使用一种机制来跟踪您已经迭代过的属性和尚未迭代过的属性,并过滤掉不可枚举的属性。例如,幕后有某种迭代器对象(以及规范的定义方式,它很可能是一个临时数组)。

在 的情况下arr,则不会;您可以在代码中以一种非常简单、有效的方式处理它。

每个循环的块的内容是相同的:对象的属性查找。(在后一种情况下,理论上也存在数字到字符串的转换。)

因此,我预计唯一的非特定于实现的答案是:额外的开销。