JavaScript数组迭代方法
我必须通过所有项目for循环迭代其中:JavaScript数组迭代方法
for (i=0; i < this.widgets.length; i++) {
this.changeWidgetArray(this.widgets[i]);
}
在for循环中,对于每一个单独的元件,我称为“changeWidgetArray”。 在这种方法中,上面的“部件” - 阵列被改变。 “changeWidgetArray”中的数组更改会影响循环迭代吗?
我的问题是:
在当下,当迭代与第一项开始,是整个阵列的所有元素“收集”,还是JavaScript的动态由一个下一次迭代之前去取一步开始。
还是这取决于JavaScript的实现?这是在ECMA-Script规范中定义的吗?
非常感谢提前
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();
}
如果在数组更改时缓存长度,您可能想提及访问无效索引。 – Cerbrus
为什么downvote?这是一个简单的是/否问题,这个答案是正确的。无需陷入陷阱或最佳实践重构在这里。 – AlienWebguy
(Downvote不是我) – Cerbrus
在循环迭代,没有变量缓存。 (除非你认为自己在临时变量做)
所以,this.widgets.length
将是widgets
阵列的精确长度,每一个它的计算时间,因为length
值各自为阵改变时更新。
您可以通过将其分配到这样一个临时变量缓存长度:
for (var i=0, l = this.widgets.length; i < l; i++) {
但是可能是一个坏主意,因为你改变了循环数组,可能使你指向数组中的无效索引。
每次修改其包含的集合时,数组长度都会更新。每当你引用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]
}
这取决于这个数组来自哪里 – SergeS
@SergeS:我不理解你。 –