JavaScript和/或JSON是否要求解析器按定义顺序枚举属性?

svi*_*gen 6 javascript json

给定一个对象定义:

var o = {x :1, y:2, z: 3, b: 4, a: 5, m: 6, X: 7};
Run Code Online (Sandbox Code Playgroud)

在枚举时,Chrome 似乎遵循定义属性的顺序:

for (var i in o) { console.log(i, o[i]); }
Run Code Online (Sandbox Code Playgroud)

产量:

x 1
y 2
z 3
b 4
a 5
m 6
X 7
Run Code Online (Sandbox Code Playgroud)

JavaScript和/或JSON是否指定了此级别的订单保留?

在任何一种情况下,它都可靠吗?

Aln*_*tak 9

没有,使用Javascript功能明确要求任何特定的枚举顺序,他们是通过定义无序.

请参阅ECMAScript规范的12.6.4节:

未指定枚举属性的机制和顺序.

  • 行为是*定义*; 它只是没有具体说明.ECMA-262保证迭代将只触发每个可枚举属性一次,并且说`Object.keys`必须按照与for ...中出现的值相同的顺序生成密钥,特别是如果它对任何更强的保证订购.它只是不需要特定的订单. (3认同)
  • @Paulpro:我希望谷歌坚持自己的枪支而不是改变Chrome.但问题是,当你的浏览器在其他地方运行的坏代码中断时,人们不会说"这个网站的JS糟透了"......他们说"这个*浏览器*很糟糕". (2认同)