![](/img/trans.png)
[英]Why does adding a method to the Array prototype in javascript break iteration on a for loop?
[英]JavaScript array iteration method
我有一个循环遍历所有项目的循环:
for (i=0; i < this.widgets.length; i++) {
this.changeWidgetArray(this.widgets[i]);
}
在for循环中,对于每个单个元素,我都将其称为“ changeWidgetArray”。 在此方法中,从上方更改了“小部件”数组。 更改“ changeWidgetArray”中的数组是否会影响循环迭代?
我的问题是:
此刻,当迭代从第一项开始时,是“收集”了其所有元素的整个数组,还是JavaScript在下一迭代步骤开始之前动态地逐个获取了数组。
还是这取决于JavaScript实现? 这是在ECMA-Script规范中定义的吗?
在此先感谢
是的 :
for (i=0; i < this.widgets.length; i++) {
this.changeWidgetArray();
}
否 :
for (var i=0, max=this.widgets.length; i < max; i++) {
this.changeWidgetArray();
}
在循环迭代期间, 不会 缓存 任何变量。 (除非您自己在临时变量中执行此操作)
因此, 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]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.