![](/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.