我试图了解 JavaSript 对象如何对其属性进行排序。据我了解,从ECMA262开始,第一个属性始终是整数索引属性。例如,如果使用 Node.js、Deno 或 Bun 打印这些对象:
console.log({ a: 0, [-1]: 1 })
console.log({ a: 0, [0]: 1 })
console.log({ a: 0, [2 ** 32 - 2]: 1 })
console.log({ a: 0, [2 ** 32 - 1]: 1 })
console.log({ a: 0, [2 ** 32]: 1 })
我们将会有
{ a: 0, '-1': 1 }
{ '0': 1, a: 0 }
{ '4294967294': 1, a: 0 }
{ a: 0, '4294967295': 1 }
{ a: 0, '4294967296': 1 }
看起来整数索引是在范围
[0, 2^32-2]
中定义的。它符合 array index
的定义:
数组索引是一个整数索引,其数值i在+0≤i< 2^32 - 1.
范围内
但是,它与
integer index
的定义不同:
整数索引是一个字符串值属性键,它是一个规范的数字字符串(参见7.1.16),其数值为+0或一个≤2^53−1的正整数。
所以,我的问题是,JavaScript 引擎应该使用
[0, 2^53-1]
还是 ECMAScript 2015 应该使用 [0, 2^32-2]
来定义 整数索引?我错过了什么吗?
此算法已更改以与实现现实保持一致,仅将数组索引放在第一位,而不是整数索引。