为什么不是" 9007199254740991"被视为整数指数?

时间:2018-03-07 08:23:59

标签: javascript specifications

根据the specification,必须将数值为2 ** 53 - 1的字符串值属性键视为整数索引。 根据{{​​3}},[[OwnPropertyKeys]]内部方法必须按升序数字顺序枚举属性键,这是一个整数索引。 根据{{​​3}},Reflect.ownKeys调用[[OwnPropertyKeys]]内部方法。

因此,如果我的理解正确,以下代码应按升序数字顺序显示属性键(即["9007199254740990", "9007199254740991"])。 但是,所有现有实现都按属性创建的按时间顺序递增显示属性键(即["9007199254740991", "9007199254740990"])。



console.log(Reflect.ownKeys({"9007199254740991": null, "9007199254740990": null}));




我的错误是什么?

2 个答案:

答案 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




有些行为像预期的那样。

请阅读以下内容:

  1. MDN web docs > Number.MAX_SAFE_INTEGER
  2. What is JavaScript's highest integer value that a number can go to without losing precision?
  3. 所以我们知道:

      

    按位运算符和移位运算符以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;
    &#13;
    &#13;

    我希望您了解了9007199254740991和JavaScript

    的内容