JavaScript数组迭代方法
我有一个for循环,循环遍历所有项:JavaScript数组迭代方法,javascript,Javascript,我有一个for循环,循环遍历所有项: for (i=0; i < this.widgets.length; i++) { this.changeWidgetArray(this.widgets[i]); } for(i=0;i
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:如果你不更改它,你可以缓存长度。