为什么Math.min([])
评估为0
?
我希望它会评估为NaN
,因为MDN's manpage for Math.min状态“如果至少有一个参数无法转换为数字,则返回NaN。”
所以我猜这个精炼的问题是为什么[]强制为0?特别是考虑到[]
是真实的(即!![] === true
)和Math.min(true) === 1
。我在考虑这个错误吗?
在Node v7.0.0上测试
答案 0 :(得分:32)
为什么
Math.min([])
评估为0
?
因为规范是这样说的:
Math.min
使用...
ToNumber
使用...
ToPrimitive
使用...
[[Default Value]]
内部方法根据提示参数将对象转换为基元。
The default hint for all objects is string。这意味着数组将转换为字符串,[]
为""
。
ToNumber
然后根据the documented algorithm将""
转换为0
Math.min
然后根据其算法获取唯一参数并返回它。
答案 1 :(得分:14)
这是因为[]
被强制转移到0
。
您可以通过以下调用看到此信息:
(new Number([])).valueOf(); // 0
因此,调用Math.min([])
与调用Math.min(0)
的{{1}}相同。
我认为0
将new Number([])
视为[]
的原因是:
Number(value)
constructor使用0
函数。ToNumber(value)
function表示将ToNumber
用于ToPrimitive
类型(数组为)。object
变为[]
,""
变为[0]
,"0"
变为[0, 1]
。"0,1"
转换为[]
,然后将其解析为""
。上述行为是因为其中包含一个或两个数字的数组可以传递给0
,但是更多的数组不能传递:
Math.min(...)
等于Math.min([])
或Math.min("")
Math.min(0)
等于Math.min([1])
或Math.min("1")
Math.min(1)
等于Math.min([1, 2])
,无法将其转换为数字。