关于javascript:为什么Math.min([])评估为0?

Why does Math.min([]) evaluate to 0?

本问题已经有最佳答案,请猛点这里访问。

为什么Math.min([])0进行评价?

我预计它将对NaN进行评估,因为mdn的math.min手册页中指出,"如果至少有一个参数无法转换为数字,则返回nan。"

所以我想,这个精致的问题是为什么[]要强制为0?特别是考虑到[]是真实的(即!![] === trueMath.min(true) === 1。我想的不对?

在节点V7.0.0上测试


Why does Math.min([]) evaluate to 0?

因为规格说明是这样说的:

Math.min使用……

ToNumber使用……

ToPrimitive使用…

[[Default Value]]内部方法根据提示参数将对象转换为原语。

所有对象的默认提示是字符串。这意味着数组被转换成一个字符串,对于[]""

然后,根据记录的算法,将""转换为0

Math.min然后接受唯一的参数并根据其算法返回它。


这是因为[]是强制0的。

您可以通过以下调用看到:

1
(new Number([])).valueOf(); // 0

因此,调用Math.min([])与调用Math.min(0)相同,后者给出0

我认为,new Number([])[]视为0的原因是:

  • Number(value)构造函数的规范使用了ToNumber函数。
  • ToNumber(value)函数的规范规定,对object类型(数组是)使用ToPrimitive
  • 数组的原值等于数组的联接,如[]变为""[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")不能转换成数字。