为什么Math.min([])的计算结果为0?
这个问题在这里已经有了答案:
为什么Math.min([])
计算结果为0
?
因为规格说明如此:
Math.min
使用...将每个参数转换为一个数字...
ToNumber
使用...将对象转换为数字
ToPrimitive
使用...将对象转换为原始值
[[Default Value]]
内部方法根据对象的提示参数将对象转换为基元。
所有对象的默认提示都是字符串。 这意味着数组被转换为一个字符串,对于[]
是""
。
ToNumber
然后根据记录的算法将""
转换为0
Math.min
然后采用唯一的参数并根据其算法返回它。
发生这种情况是因为[]
被强制为0
。
您可以通过以下电话查看:
(new Number([])).valueOf(); // 0
因此,调用Math.min([])
与调用Math.min(0)
它给出0
Math.min(0)
相同。
我相信new Number([])
将[]
视为0
的原因是因为:
Number(value)
构造函数的规范使用ToNumber
函数。 ToNumber(value)
函数的规范说要使用ToPrimitive
作为object
类型(数组是)。 []
变为""
, [0]
变为"0"
, [0, 1]
"0,1"
[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")
,它不能转换为数字。