2012-11-19 115 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]]属性的值。

参考