为什么Math.min([])评估为0?

时间:2017-01-11 21:49:00

标签: javascript

为什么Math.min([])评估为0

我希望它会评估为NaN,因为MDN's manpage for Math.min状态“如果至少有一个参数无法转换为数字,则返回NaN。”

所以我猜这个精炼的问题是为什么[]强制为0?特别是考虑到[]是真实的(即!![] === true)和Math.min(true) === 1。我在考虑这个错误吗?

在Node v7.0.0上测试

2 个答案:

答案 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}}相同。

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

  1. spec for the Number(value) constructor使用0函数。
  2. spec for the ToNumber(value) function表示将ToNumber用于ToPrimitive类型(数组为)。
  3. 数组的原始值等于连接数组,例如object变为[]""变为[0]"0"变为[0, 1]
  4. 数字构造函数因此将"0,1"转换为[],然后将其解析为""
  5. 上述行为是因为其中包含一个或两个数字的数组可以传递给0,但是更多的数组不能传递:

    • Math.min(...)等于Math.min([])Math.min("")
    • Math.min(0)等于Math.min([1])Math.min("1")
    • Math.min(1)等于Math.min([1, 2]),无法将其转换为数字。