标准(ES2016)将ToLength
操作定义为
len
成为? ToInteger(argument)
。len ≤ +0
,请返回+0
。len
为+∞
,请返回2^53-1
。min(len, 2^53-1)
。为什么步骤3必须在这里? min(len, 2^53-1)
len is +Infinity
不会处理这种情况吗?
PS:在ES2015中,它略有不同,但具有相同的“冗余”步骤。
UPD :查看指向tc39存储库的链接,我在其中解决了相同的问题。
参考文献:
答案 0 :(得分:1)
鉴于Math.min在给出选项或Infinity的情况下返回2 ^ 32-1,我怀疑规范作者过于热心。
> Math.min(Infinity, Math.pow(2, 53)-1)
9007199254740991
此外," min"当涉及无限性时,它真的没有意义。虽然Infinity可以具有正值或负值,但+ Infinity并不总是大于所有其他值。无限有时可能意味着"未定义的数字"有时可以使用限制来计算。请不要在这里问我一个例子。
答案 1 :(得分:1)
ToLength
也不会返回Infinity
值
考虑作为一个数字。
If len is Infinity
return max_safe_integer
else
return min(len, max_safe_integer)
为什么步骤3必须在这里?
如果len
为Infinity
,则此步骤对函数返回Number
的操作要少得多。由于实施min
以执行更多操作,而不仅仅是使用abstract relational comparison进行检查。
答案 2 :(得分:0)
正如发现的那样 - 在以下PR中它是多余的并得到改进:https://github.com/tc39/ecma262/pull/738