为什么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") ,它不能转换为数字。 