根据the specification,必须将数值为2 ** 53 - 1
的字符串值属性键视为整数索引。
根据{{3}},[[OwnPropertyKeys]]
内部方法必须按升序数字顺序枚举属性键,这是一个整数索引。
根据{{3}},Reflect.ownKeys
调用[[OwnPropertyKeys]]
内部方法。
因此,如果我的理解正确,以下代码应按升序数字顺序显示属性键(即["9007199254740990", "9007199254740991"]
)。
但是,所有现有实现都按属性创建的按时间顺序递增显示属性键(即["9007199254740991", "9007199254740990"]
)。
console.log(Reflect.ownKeys({"9007199254740991": null, "9007199254740990": null}));

我的错误是什么?
答案 0 :(得分:2)
The specification of the [[OwnPropertyKeys]]
internal method in ECMAScript 2017(和in 2018)与所有主要JavaScript引擎的实际行为都不匹配,因此在ECMAScript 2019 the specification has been fixed中。
参见the discussion on GitHub。
答案 1 :(得分:1)
9007199254740991
是JavaScript中的最大安全整数。
var x = Number.MAX_SAFE_INTEGER + 1,
y = Number.MAX_SAFE_INTEGER + 2,
z = Number.MAX_SAFE_INTEGER + 3,
i = Number.MAX_SAFE_INTEGER + 4,
j = Number.MAX_SAFE_INTEGER + 5;
console.log("max: "+Number.MAX_SAFE_INTEGER);
// expected output: 9007199254740991
// real output: 9007199254740991
console.log("x: "+x);
// expected output: 9007199254740992
// real output: 9007199254740992
console.log("y: "+y);
// expected output: 9007199254740993
// real output: 9007199254740992
console.log("z: "+z);
// expected output: 9007199254740994
// real output: 9007199254740994
console.log("i: "+i);
// expected output: 9007199254740995
// real output: 9007199254740996
console.log("j: "+j);
// expected output: 9007199254740996
// real output: 9007199254740996

有些行为像预期的那样。
请阅读以下内容:
所以我们知道:
按位运算符和移位运算符以32位整数运算,因此在这种情况下,最大安全整数为2 31 -1或2147483647。
我不知道Reflect.ownKeys()
如何将索引排序为数字顺序
由于以下代码段:
const objs = [
// does not work
{
9007199254740991: null,
9007199254740990: null,
},
// works
{
2147483648: null,
// max save bitwise number
2147483647: null,
},
// works
{
4294967295: null,
// max save bitwise number times 2
4294967294: null,
},
// does not work
{
5368709118: null,
// max save bitwise number times 2.5
5368709117: null,
}
];
const objkeys = [],
max = objs.length;
for (let i = 0; i < max; i++) {
objkeys.push(Reflect.ownKeys(objs[i]))
}
for (let i = 0; i < max; i++) {
console.log(objkeys[i][0]+" < "+objkeys[i][1]);
}
&#13;
我希望您了解了9007199254740991和JavaScript
的内容