大数字索引的 Object.keys 顺序?

tri*_*cot 3 javascript ecmascript-6

我有这个测试:

\n\n

\r\n
\r\n
let obj = {\r\n    "5555555555": 5,\r\n    "4444444444": 4,\r\n    "3333333333": 3,\r\n    "2222222222": 2,\r\n};\r\nconsole.log(Object.keys(obj));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

输出是["2222222222", "3333333333", "5555555555", "4444444444"]

\n\n

然而,EcmaScript 2015 规范定义了[[OwnPropertyKeys]]的顺序:

\n\n
\n
    \n
  1. 对于O的每个自己的属性键P来说,它是一个整数索引,按升序数字索引顺序,\n a。添加P作为keys的最后一个元素。
  2. \n
\n
\n\n

整数索引定义

\n\n
\n

整数索引是一个字符串值属性键,它是规范的数字字符串 \n,其数值是正+0整数 \xe2\x89\xa4 2 53 \xe2\x88\x921。\n数组索引是一个整数索引,其数值i的范围为 +0 \xe2\x89\xa4 i < 2 32 \xe2\x88\x921。

\n
\n\n

由于上面代码片段中的所有四个属性obj根据定义都是整数索引,为什么当我调用 时它们没有按数字顺序列出Object.keys

\n\n

我在 Chrome、Firefox、Edge、甚至 Internet Explorer 11 中看到了相同的顺序。看起来他们对数组索引而不是(所有)整数索引应用了“升序数字索引顺序” 。只有这样才能解释为什么 1111111111 和 2222222222 按数字顺序排在前面(唯一两个 < 2 32 -1 的键),而 4444444444 和 5555555555 按其原始相对顺序排在最后。

\n\n

我缺少什么?这些实现是否违反了规范?

\n

tri*_*cot 5

没有一个主要实现符合特定的 ES6 规范。但请注意,EcmaScript 2015-2019 中允许例外(请参阅

\n

关于所描述的行为,请参阅 V8 错误报告Issue 7874: Respect OrdinaryOwnPropertyKeys order 等

\n

虽然 EcmaScript 2016、2017 和 2018 规范在这方面保持不变,但决定使 EcmaScript2019 与现实保持一致。关于[[OwnPropertyKeys]]()的部分现在如下:

\n
\n
    \n
  1. 对于作为数组索引的O的每个自己的属性键P ,按升序数字索引顺序,执行\n\xc2\xa0 \xc2\xa0 a。添加P作为keys的最后一个元素。
  2. \n
\n
\n

因此,引用的是数组索引,它的定义未更改(+0 \xe2\x89\xa4 i < 2 32 \xe2\x88\x921)。

\n

此更改发生在拉取请求规范中:在 OrdinaryOwnPropertyKeys 中使用数组索引而不是整数索引。\n另请参阅那里的注释和交叉引用。

\n