最近我在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.14ECMAScript 5标准中说明了Object.keys
这一点
如果实现为for-in语句定义了特定的枚举顺序,则必须在此算法的步骤5中使用相同的枚举顺序.
这意味着该for-in
语句的任何排序,并Object.keys
完全依赖于实现.