为什么在javascript中for的速度很慢?

为什么在javascript中for的速度很慢?,javascript,Javascript,我在几个地方读到,for in循环比在数组上循环慢。。。虽然我知道在sizeof(type)块中向前移动实际上比在幕后迭代对象的关键帧要轻松得多,但我仍然很好奇,到底是什么原因导致它如此缓慢 是否必须执行反向散列函数才能获取密钥,而这一过程很慢?对于任何特定引擎,这一问题的真正答案可能取决于该引擎的实现。(如有差异,差异的大小也会如此。) 然而,有不变量。例如,考虑: var obj = {a: "alpha", b: "beta"}; var name; for (name in obj) {

我在几个地方读到,for in循环比在数组上循环慢。。。虽然我知道在sizeof(type)块中向前移动实际上比在幕后迭代对象的关键帧要轻松得多,但我仍然很好奇,到底是什么原因导致它如此缓慢


是否必须执行反向散列函数才能获取密钥,而这一过程很慢?

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

然而,有不变量。例如,考虑:

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]);
}
var obj={a:“alpha”,b:“beta”};
变量名;
for(obj中的名称){
console.log(obj[name]);
}
var arr=[“α”,“β”];
var指数;
对于(索引=0;索引
对于
obj
,引擎必须使用一种机制来跟踪哪些属性已经迭代过,哪些属性没有迭代过,以及过滤掉不可枚举的属性。例如,在幕后有某种迭代器对象(以及规范的定义方式,很可能是一个临时数组)

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

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


因此,对于这一点,我认为唯一的非实现特定的答案是:额外的开销。

对于..每个
循环使用

迭代器是具有
next()
方法的对象。生成器是一个工厂函数,包含
yield()
表达式。这两种构造都比整数索引变量更复杂

在典型的
for(var i=0;i
循环中,在几乎所有迭代中执行的两个命令是
i++
i
。这可以说比进行函数调用(
next()
yield()
)快得多

此外,循环初始化(
var i=0
)也比使用
next()
方法创建迭代器对象或调用生成器创建迭代器要快。然而,这在很大程度上取决于实现,Javascript引擎的创建者尽最大努力加速这些常用的语言特性


我想说的是,这种差异非常微小,以至于我可能想花时间优化代码的其他部分。语法的选择应考虑代码可读性和可维护性比性能,当性能增益是如此之小,以增加复杂性。话虽如此,请使用对您和其他在您变得富有和出名后维护您的代码的开发人员更有意义的语法!;)

是的,我想得到所有的钥匙是一个相对缓慢的过程相比。。。没有得到它们;)<在
中。因此,从外部获取钥匙和/或与此相关的一切都比较慢。但正如T.J.所说,这也取决于实施情况。