4

我不记得在哪里,但我曾经看到它说for..in循环可以按照实现者喜欢的任何顺序遍历元素,包括向前、向后、随机或在每次执行for..in循环时在向前和向后交替。但是,在实践中,不知何故,我不认为后者确实存在任何实现的情况。(虽然,我们知道有某个浏览器喜欢把事情搞砸,所以你永远不能太确定,但我离题了。)

我的观点是,虽然for..in在实践中可能没有那么严重的排序偏差,但我想知道 ECMAScript 实现之间存在什么偏差(如果有的话)。我想现在主要的应该是 JScript、Chakra、Futhark、Carakan、JavascriptCore、SquirrelFish、V8、SpiderMonkey 和 TraceMonkey,仅供参考。

4

1 回答 1

5

首先,这是规范中关于枚举顺序的参考:

12.6.4 for-in 语句

未指定枚举属性的机制和顺序(第一个算法中的步骤 6.a,第二个算法中的步骤 7.a)。被枚举对象的属性可能在枚举过程中被删除。如果在枚举期间还没有访问过的属性被删除,那么它就不会被访问。如果在枚举过程中向正在枚举的对象添加了新属性,则不能保证在活动枚举中访问新添加的属性。在任何枚举中不能多次访问属性名称。

我能想到的只有这些:

  • 早期(也许是当前?)版本的 IE 会将枚举期间添加的新属性放在枚举的末尾,以便当前运行的for-in

  • V8 具有不同的枚举顺序,如本错误报告中所述,该错误报告已作为WorkingAsIntended关闭

     var a = {"foo":"bar", "3": "3", "2":"2", "1":"1"};
    

    Firefox 和 V8 中的测试显示了不同的顺序。

这不是一个列表。当然可能还有更多。我认为@Pointy 的评论总结了这一点。没有保证。即使您有一个以一致方式可靠枚举的对象,这并不意味着它会在下一个版本升级时这样做。使用工具来指定它们如何工作,而不是仅仅为了看起来有效。

于 2012-11-18T14:46:51.957 回答