最近我在 Firefox 中发现了这种奇怪的行为:
此代码自动对属性进行排序:
var an_obj = { "4": "d", "1": "a", "2": "c"};
alert(Object.keys(an_obj)); // will alert "1, 2, 4"
虽然这个不是:
var value2 = {"1003":1, "1001":2, "1000":3};
alert(Object.keys(value2));// will alert "1003, 1001, 1000"
任何大于 1000 的数字在 Firefox 中都会有不同的行为,而其他浏览器(Chrome、IE11)将按照预期的大于 1000 的自动排序数字运行。
我认为这是 FireFox 中的一个错误,我错了吗?
更新1
这使得同一 FireFox 实现中的顺序“不可预测”。我可以理解根本没有对值进行排序或根据一个标准进行排序,但在“任意”数字之后不会表现出“不可预测”的行为。
最佳答案
这不是一个错误。对象不保证其属性的任何顺序,并且在某些情况下不应依赖 Object.keys
的任何顺序。
§15.2.3.14 ECMAScript 5 standard中有说明关于Object.keys
If an implementation defines a specific order of enumeration for the for-in statement, that same enumeration order must be used in step 5 of this algorithm.
这意味着 for-in
语句和 Object.keys
的任何排序完全取决于实现。
关于Firefox 与其他浏览器中的 Javascript 自动排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21027971/