为什么Math.min([])
评估0
?
我希望它会评估,NaN
因为MDN的Math.min联机帮助页指出"如果至少有一个参数无法转换为数字,则返回NaN."
所以我想这个精炼的问题是为什么[]强制为0?特别是考虑到这[]
是真实的(即!![] === true
)和Math.min(true) === 1
.我在想这个错吗?
在Node v7.0.0上测试
为什么
Math.min([])
评估0
?
因为规范如此说:
Math.min
使用...将每个参数转换为数字
ToNumber
使用...将对象强制转换为数字
ToPrimitive
使用...将对象强制转换为原始值
[[Default Value]]
internal方法根据提示参数将对象转换为基元.
所有对象的默认提示是字符串.这意味着数组被转换成字符串,这对于[]
是""
.
ToNumber
然后转换""
到0
,每所记录的算法
Math.min
然后根据其算法获取唯一参数并返回它.
发生这种情况是因为[]
被胁迫0
.
你可以通过以下电话看到这个:
(new Number([])).valueOf(); // 0
因此,呼叫Math.min([])
与Math.min(0)
给出的呼叫相同0
.
我认为,之所以new Number([])
把[]
为0
是因为:
构造函数的规范Number(value)
使用了一个ToNumber
函数.
该函数的规范ToNumber(value)
说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])
等于Math.min("1,2")
哪个不能转换为数字.