我有一个for循环遍历所有项目:
for (i=0; i < this.widgets.length; i++) {
this.changeWidgetArray(this.widgets[i]);
}
在for循环中,对于每个元素,我调用“changeWidgetArray”。 在这种方法中,改变了上面的“小部件” - 阵列。 “changeWidgetArray”中的数组更改是否会影响循环迭代?
我的问题是:
目前,当迭代从第一个项开始时,整个数组的所有元素都被“收集”,或者JavaScript在下一个迭代步骤开始之前逐个动态地获取。
或者这取决于JavaScript的实现?这是在ECMA-Script规范中定义的吗?
非常感谢
答案 0 :(得分:5)
是:
for (i=0; i < this.widgets.length; i++) {
this.changeWidgetArray();
}
否:
for (var i=0, max=this.widgets.length; i < max; i++) {
this.changeWidgetArray();
}
答案 1 :(得分:2)
在循环迭代期间,没有变量缓存。 (除非你自己在临时变量中这样做)
因此,this.widgets.length
每次评估时都是widgets
数组的确切长度,因为每次更改数组时都会更新length
的值。
您可以通过将长度分配给临时变量来缓存长度,如下所示:
for (var i=0, l = this.widgets.length; i < l; i++) {
但是可能是个坏主意,因为你正在更改循环中的数组,可能会让你指向数组中的无效索引。
答案 2 :(得分:0)
每次修改包含的集合时,都会更新数组长度。每次引用array.length时,它都会反映数组的当前大小。
出于这个原因,以及许多性能优势,您应该始终编写如下代码:
for(var i = 0, l = array.length; i < l; i++){
// Do stuff with array[l]
}
如果你这样做,你也可以获得更多的表现(假设你遍历的方向并不重要):
var l = array.length;
while(l--){
// Do stuff with array[l]
}