2012-11-19 112 views
3

我看到一個關於...的iteration order的問題,並警告說訂單不可信。內部完成當前和訪問節點的迭代和跟蹤過程,以及JavaScript引擎之間的差異如何?在JavaScript中如何實現?

+0

此相關帖子可能會提供一些見解 http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop – lostsource

回答

3

the MDN documentation for for...in(強調):

遍歷對象,的以任意順序的枚舉的屬性。

我確定JavaScript引擎的內部細節各不相同,甚至在任何特定引擎的版本中也是如此。我猜測在很多引擎中,它是通過某種哈希表實現完成的。由於哈希函數會隨着哈希表的增長而對鍵重新排序,所以屬性ab的相對順序可以通過添加新屬性c而改變,而不更改引擎或任何東西。

0

看來的Object.keys()Object.defineProperties實施應模仿for...in行爲:

如果實現定義枚舉的特定順序對換的說法,同樣的枚舉順序,必須在使用這個算法的第5步。

所以它們可以用作參考。

delete操作員還可以事複雜:

的力學和列舉的屬性順序(在第一算法步驟6.A,在第二步驟7.A)沒有被指定。在枚舉過程中可能會刪除枚舉對象的屬性。如果枚舉過程中尚未訪問的屬性被刪除,則不會被訪問。如果在枚舉過程中將新屬性添加到枚舉對象中,則新增屬性不保證在活動枚舉中被訪問。任何枚舉中的屬性名稱都不能被訪問多次。

如可以命名在原型鏈衝突:

枚舉一個對象的屬性包括它的原型的枚舉性質,並且原型的樣機,等,遞歸;但是原型的屬性如果被「隱藏」,則不會枚舉,因爲原型鏈中的某個以前的對象具有同名的屬性。確定原型對象的屬性是否被原型鏈上的前一個對象遮蔽時,不考慮[[Enumerable]]屬性的值。

參考