JavaScript 中 integer index 的定义 (ECMAScript 2015)

Definition of `integer index` in JavaScript (ECMAScript 2015)

提问人:Sergey Shandar 提问时间:11/16/2023 最后编辑:BergiSergey Shandar 更新时间:11/16/2023 访问量:40

问:

我正在尝试了解 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 的数值 i < 2^32 - 1 ≤范围内。

但是,它与以下定义不同:integer index

整数索引是一个字符串值属性键,它是规范数字字符串(参见 7.1.16),其数值为 +0 或正整数≤ 2^53−1。

所以,我的问题是,JavaScript引擎应该使用还是ECMAScript 2015应该用于整数索引的定义?我错过了什么吗?[0, 2^53-1][0, 2^32-2]

JavaScript 对象 ecmascript-6 language-lawyer

评论


答:

1赞 Bergi 11/16/2023 #1

该算法在 2018 年进行了更改,以符合实现现实,仅将数组索引放在首位,而不是整数索引。

不,实现 ES2015 的引擎不应该重新定义整数索引,以表示规范所说的其他含义。他们应该使用 253-1(但当时没有)。另一方面,实现 ES2019 的引擎确实并且应该在 OrdinaryOwnPropertyKeys 算法中使用数组索引(最多 232-2),这就是您在尝试此算法时所看到的。