2013-01-23 61 views
1

我必须通过所有项目for循环迭代其中:JavaScript数组迭代方法

for (i=0; i < this.widgets.length; i++) { 
    this.changeWidgetArray(this.widgets[i]); 
} 

在for循环中,对于每一个单独的元件,我称为“changeWidgetArray”。 在这种方法中,上面的“部件” - 阵列被改变。 “changeWidgetArray”中的数组更改会影响循环迭代吗?

我的问题是:

在当下,当迭代与第一项开始,是整个阵列的所有元素“收集”,还是JavaScript的动态由一个下一次迭代之前去取一步开始。

还是这取决于JavaScript的实现?这是在ECMA-Script规范中定义的吗?

非常感谢提前

+0

这取决于这个数组来自哪里 – SergeS

+0

@SergeS:我不理解你。 –

回答

5

YES

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

NO

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

如果在数组更改时缓存长度,您可能想提及访问无效索引。 – Cerbrus

+2

为什么downvote?这是一个简单的是/否问题,这个答案是正确的。无需陷入陷阱或最佳实践重构在这里。 – AlienWebguy

+2

(Downvote不是我) – Cerbrus

2

在循环迭代,没有变量缓存。 (除非你认为自己在临时变量做)

所以,this.widgets.length将是widgets阵列的精确长度,每一个它的计算时间,因为length值各自为阵改变时更新。

您可以通过将其分配到这样一个临时变量缓存长度:

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

但是可能是一个坏主意,因为你改变了循环数组,可能使你指向数组中的无效索引。

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] 
} 
+1

_“你应该总是......”_ **不能。**如果你正在搞乱你正在迭代的数组,那么这是一个非常糟糕的主意。不要告诉某人“总是”做X. – Cerbrus

+0

@Cerburs。所以你说在迭代它的时候混淆数组并不好? –

+1

@WolfgangAdamec:不,我要说的是:1:如果你在迭代它的时候改变了数组的内容量,那么缓存这个长度通常是一个坏主意。 2:如果你不改变这个,你可以缓存这个长度。 – Cerbrus