2015-06-14 41 views
0
A = { 1:1, 2:2, 3:3, 4:4, 5:5 }; 
for (var i in A) { 
    console.log(i); 
    if (A[i] == 4) delete A[i], A[7] = 7; 
    if (A[i] == 2) delete A[i], A[0] = 0; 
    if (A[i] == 7) console.log('seven'); 
    if (A[i] == 0) console.log('zero'); 
} 
console.log(A); 

這似乎工作,但我不知道執行for(.. in ..)循環的細節,以確保它在大多數情況下是安全的。修改(..in ..)循環中的對象是否安全?

See also here the same question about arrays.

+0

http://es5.github.io/#x12.6.4 – Teemu

回答

1

According the MDN reference你不應該試圖如果財產是一個迭代修改,然後在以後的時間 訪問做這個

,其在循環值是其在以後的時間價值。

在訪問之前被刪除的屬性將不會在稍後訪問 。

添加到迭代爲 的對象中添加的屬性可以在迭代中訪問或省略。

一般來說,最好不要在迭代期間添加,修改或刪除對象 中的屬性,而不是當前正在訪問的屬性。

沒有保證增加的財產是否會被 訪問,無論是修改的屬性(比當前的除外)將 之前被訪問或者被修改後,或刪除 財產是否會被訪問在它被刪除之前。

所以雖然它可能在你的測試中工作到目前爲止它可能並不總是。

0

通過使用該方法,因爲當你刪除元素,你可能會跳過的A指標,所有其他元素的索引將被轉移-1,並且隨後通過迭代錯過。相反,您可以創建第二個列表,然後僅向A添加好值。

相關問題