在“ToLength”

时间:2016-10-27 02:49:15

标签: javascript ecmascript-6

标准(ES2016)将ToLength操作定义为

  1. len成为? ToInteger(argument)
  2. 如果len ≤ +0,请返回+0
  3. 如果len+∞,请返回2^53-1
  4. 返回min(len, 2^53-1)
  5. 为什么步骤3必须在这里? min(len, 2^53-1)

    时,len is +Infinity不会处理这种情况吗?

    PS:在ES2015中,它略有不同,但具有相同的“冗余”步骤。

    UPD :查看指向tc39存储库的链接,我在其中解决了相同的问题。

    参考文献:

3 个答案:

答案 0 :(得分:1)

鉴于Math.min在给出选项或Infinity的情况下返回2 ^ 32-1,我怀疑规范作者过于热心。

> Math.min(Infinity, Math.pow(2, 53)-1)
9007199254740991

此外," min"当涉及无限性时,它真的没有意义。虽然Infinity可以具有正值或负值,但+ Infinity并不总是大于所有其他值。无限有时可能意味着"未定义的数字"有时可以使用限制来计算。请不要在这里问我一个例子。

答案 1 :(得分:1)

即使是{p> ToLength也不会返回Infinity值 考虑作为一个数字。

If len is Infinity
  return max_safe_integer
else
  return min(len, max_safe_integer)
  

为什么步骤3必须在这里?

如果lenInfinity,则此步骤对函数返回Number的操作要少得多。由于实施min以执行更多操作,而不仅仅是使用abstract relational comparison进行检查。

答案 2 :(得分:0)

正如发现的那样 - 在以下PR中它是多余的并得到改进:https://github.com/tc39/ecma262/pull/738