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

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

See also the paired question about an object modification

+4

用'for..in'完成迭代數組不是個好主意。 – Teemu

+1

[ECMA 262 - 'for-in'聲明](http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.4)。在先前的迭代完成之後,一次檢索一個屬性。所以,如果你問是否有可能修改對象,使循環無限延伸,是的,這是可能的。 –

+0

*有可能嗎?*是的。 *安全嗎?*是的。 *這是一種很好的做法嗎?*不,因爲您所指的索引很容易迷路。 –

回答

0

這是完全安全的改變意義上的對象,你不會得到瀏覽器抱怨任何改變陣列。請注意,在你的例子中,如果你看到「七,零」,只是「七」,只是「零」,或者什麼也沒有被打印,那麼它仍然是有效的行爲。

一方面,瀏覽器必須確保在被訪問之前被刪除的屬性未被枚舉。在另一方面,瀏覽器可以自由:

  • 枚舉新的屬性或讓他們跳出循環
  • 以任何順序枚舉屬性。

這就是爲什麼它不是安全使用for ... in來遍歷數組,當你依靠索引/順序。索引被視爲可枚舉的屬性,可以使用與對象屬性相同的機制枚舉(對迭代順序沒有期望)。