JavaScript数组迭代方法

时间:2013-01-23 08:03:59

标签: javascript

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

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

在for循环中,对于每个元素,我调用“changeWidgetArray”。 在这种方法中,改变了上面的“小部件” - 阵列。 “changeWidgetArray”中的数组更改是否会影响循环迭代?

我的问题是:

目前,当迭代从第一个项开始时,整个数组的所有元素都被“收集”,或者JavaScript在下一个迭代步骤开始之前逐个动态地获取。

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

非常感谢

3 个答案:

答案 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]
}