JavaScript数组迭代方法

JavaScript数组迭代方法,javascript,Javascript,我有一个for循环,循环遍历所有项: for (i=0; i < this.widgets.length; i++) { this.changeWidgetArray(this.widgets[i]); } for(i=0;i

我有一个for循环,循环遍历所有项:

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(this.widgets[i]); 
}
for(i=0;i
在for循环中,对于每个元素,我都调用“changeWidgetArray”。 在这个方法中,上面的“widgets”数组被改变。 在“changeWidgetArray”中更改此数组是否会影响循环迭代

我的问题是:

此时,当迭代从第一个项开始时,是整个数组及其所有元素都已“收集”,还是JavaScript在下一个迭代步骤开始之前一个接一个地动态获取

还是这取决于JavaScript实现?这是否在ECMA脚本规范中定义

提前非常感谢

是的

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(); 
}
for (var i=0, max=this.widgets.length; i < max; i++) {
  this.changeWidgetArray(); 
}
for(i=0;i

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(); 
}
for (var i=0, max=this.widgets.length; i < max; i++) {
  this.changeWidgetArray(); 
}
for(var i=0,max=this.widgets.length;i

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(); 
}
for (var i=0, max=this.widgets.length; i < max; i++) {
  this.changeWidgetArray(); 
}
for(i=0;i

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(); 
}
for (var i=0, max=this.widgets.length; i < max; i++) {
  this.changeWidgetArray(); 
}
for(var i=0,max=this.widgets.length;i
在循环迭代过程中,没有变量被缓存。(除非您自己在临时变量中这样做)

因此,
this.widgets.length
将是
widgets
数组的精确长度,每次对其求值,因为
length
的值会在数组每次更改时更新

可以通过将长度指定给以下临时变量来缓存长度:

for (var i=0, l = this.widgets.length; i < l; i++) {
for(var i = 0, l = array.length; i < l; i++){
  // Do stuff with array[l]
}
for(var i=0,l=this.widgets.length;i

但这可能是个坏主意,因为您正在更改循环中的数组,可能会使您指向数组中的无效索引。

在循环迭代过程中,没有变量被缓存(除非您自己在临时变量中这样做)

因此,
this.widgets.length
将是
widgets
数组的精确长度,每次对其求值,因为
length
的值会在数组每次更改时更新

可以通过将长度指定给以下临时变量来缓存长度:

for (var i=0, l = this.widgets.length; i < l; i++) {
for(var i = 0, l = array.length; i < l; i++){
  // Do stuff with array[l]
}
for(var i=0,l=this.widgets.length;i

但这可能不是个好主意,因为您正在更改循环中的数组,可能会使您指向数组中的无效索引。

每次修改数组包含的集合时,数组长度都会更新。无论何时引用array.length,它都会反映数组的当前大小

出于这个原因,以及许多性能优势,您应该始终这样编写代码:

for (var i=0, l = this.widgets.length; i < l; i++) {
for(var i = 0, l = array.length; i < l; i++){
  // Do stuff with array[l]
}

每次修改数组包含的集合时,数组长度都会更新。每次引用array.length时,它都会反映数组的当前大小

出于这个原因,以及许多性能优势,您应该始终这样编写代码:

for (var i=0, l = this.widgets.length; i < l; i++) {
for(var i = 0, l = array.length; i < l; i++){
  // Do stuff with array[l]
}

这取决于数组的位置from@SergeS:我不明白你的意思。这取决于这个数组来自哪里from@SergeS:我不明白您的意思。如果在更改数组时缓存了长度,您可能会提到访问无效索引。为什么要进行向下投票?这是一个简单的是/否问题,答案是正确的。无需深入了解chas或最佳实践在此重构。^不用担心,我知道,这是在你发表评论6分钟后发生的。匿名否决票是这个网站最愚蠢的事情。他们至少应该需要一个理由。我完全同意。如果没有明显的理由被否决,可能会让人非常沮丧。如果更改数组时会缓存长度。为什么要进行向下投票?这是一个简单的“是/否”问题,答案是正确的。无需在此处进行gotchas或最佳做法重构。^不用担心,我知道,这是在您发表评论后6分钟发生的。匿名向下投票是该网站最愚蠢的事情。它们至少需要一个理由。我是com完全同意。没有明显的理由被否决可能会让人非常沮丧。“你应该一直……”不。如果你正在对正在迭代的数组进行处理,这是一个非常糟糕的主意。不要告诉别人“一直”do X.@Cerburs.那么你说在对数组进行迭代时弄乱它是不好的吗?@WolfgangAdamec:不,我的意思是:1:如果你在对数组进行迭代时确实更改了数组的内容量,那么缓存长度通常是个坏主意。2:如果你不更改它,你可以缓存长度。“你应该始终…”不。如果你在搞乱你正在迭代的数组,这是一个非常糟糕的主意。不要告诉别人“总是”do X.@Cerburs.那么你说在对数组进行迭代时弄乱它是不好的吗?@WolfgangAdamec:不,我的意思是:1:如果你在对数组进行迭代时确实更改了数组的内容量,那么缓存长度通常是个坏主意。2:如果你不更改它,你可以缓存长度。