我已经在几个地方读过,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]); }
在obj的情况下,引擎必须使用一种机制来跟踪你已经迭代过的属性和你没有过去的属性,以及过滤掉不可枚举的属性.例如,幕后有一些迭代器对象(以及定义规范的方式,可能是一个临时数组).
在arr的情况下,它没有;您正在以非常简单,有效的方式处理代码.
每个循环的块的内容是相同的:对象的属性查找. (在后一种情况下,理论上也有数字到字符串的转换.)
所以我希望唯一的非实现特定的答案是:额外的开销.