2013-01-23 107 views
1

我必須通過所有項目for循環迭代其中:JavaScript數組迭代方法

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

在for循環中,對於每一個單獨的元件,我稱爲「changeWidgetArray」。 在這種方法中,上面的「部件」 - 陣列被改變。 「changeWidgetArray」中的數組更改會影響循環迭代嗎?

我的問題是:

在當下,當迭代與第一項開始,是整個陣列的所有元素「收集」,還是JavaScript的動態由一個下一次迭代之前去取一步開始。

還是這取決於JavaScript的實現?這是在ECMA-Script規範中定義的嗎?

非常感謝提前

+0

這取決於這個數組來自哪裏 – SergeS

+0

@SergeS:我不理解你。 –

回答

5

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(); 
} 
+1

如果在數組更改時緩存長度,您可能想提及訪問無效索引。 – Cerbrus

+2

爲什麼downvote?這是一個簡單的是/否問題,這個答案是正確的。無需陷入陷阱或最佳實踐重構在這裏。 – AlienWebguy

+2

(Downvote不是我) – Cerbrus

2

在循環迭代,沒有變量緩存。 (除非你認爲自己在臨時變量做)

所以,this.widgets.length將是widgets陣列的精確長度,每一個它的計算時間,因爲length值各自爲陣改變時更新。

您可以通過將其分配到這樣一個臨時變量緩存長度:

for (var i=0, l = this.widgets.length; i < l; i++) { 

但是可能是一個壞主意,因爲你改變了循環數組,可能使你指向數組中的無效索引。

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] 
} 
+1

_「你應該總是......」_ **不能。**如果你正在搞亂你正在迭代的數組,那麼這是一個非常糟糕的主意。不要告訴某人「總是」做X. – Cerbrus

+0

@Cerburs。所以你說在迭代它的時候混淆數組並不好? –

+1

@WolfgangAdamec:不,我要說的是:1:如果你在迭代它的時候改變了數組的內容量,那麼緩存這個長度通常是一個壞主意。 2:如果你不改變這個,你可以緩存這個長度。 – Cerbrus