Javascript 为什么在ES2015中Math.max(…[])等于-无穷大?

Javascript 为什么在ES2015中Math.max(…[])等于-无穷大?,javascript,ecmascript-6,Javascript,Ecmascript 6,Math.max([])将是0 而[..[]]是[] 但是为什么在ES2015中Math.max(…[])等于-无穷大?因为Math.max(…[])不是Math.max(…[])。在第一种情况下,您真正调用的是Math.max(),即-Infinity。请参阅函数调用中的扩展运算符-如果您看到文档,您可以知道当没有传递参数时,Math.max返回无穷大的原因 如果没有给出任何参数,则结果为-∞. 因此,当您在函数调用中扩展空数组时,这就像是在没有参数的情况下调用函数。如果您查看Math.max

Math.max([])
将是
0

[..[]]
[]

但是为什么在ES2015中
Math.max(…[])
等于
-无穷大?

因为
Math.max(…[])
不是
Math.max(…[])
。在第一种情况下,您真正调用的是
Math.max()
,即
-Infinity
。请参阅函数调用中的扩展运算符-

如果您看到文档,您可以知道当没有传递参数时,
Math.max
返回无穷大的原因

如果没有给出任何参数,则结果为-∞.


因此,当您在函数调用中扩展空数组时,这就像是在没有参数的情况下调用函数。

如果您查看
Math.max(…[])
的babel输出,您将得到
Math.max.apply(Math,[])
。如果您在ES5中记录它,您会发现出于某种原因,它给您提供了
-无穷大
,因为它与不带参数调用它是一样的

实际上,
Math.max()
给出了
-无穷大


如果您需要提醒:
fn.apply(yourThis[a,b,c])
fn(a,b,c)
使用
Math.max([])
时,首先将
[]
转换为字符串,然后再转换为数字。它实际上并不被视为一个参数数组

使用
Math.max(…[])
将数组视为通过扩展运算符的参数集合。由于数组为空,这与不带参数调用相同。 根据这个公式产生无穷大

如果没有给出参数,结果是-无穷大


以下示例显示了使用数组调用的区别:

console.log(+[])//0    [] -> '' -> 0
console.log(+[3])//3    [] -> '3' -> 3
console.log(+[3,4])//楠
console.log(…[3])//3.
console.log(…[3,4])//3.4(数组用作参数)
console.log(Math.max([])//0[]已转换为0
console.log(Math.max());//-无穷大:没有参数的默认值
console.log(Math.max(…[]);//-无穷
log(Math.max([3,4])//楠

log(Math.max(…[3,4])//4
FTR解决此问题的方法是在spread运算符中使用最小值。比如:

Math.max(MIN_VALUE, ...arr)
Math.max(0, ...[]) --> 0
Math.max(0, ...[1]) --> 1
Math.max(0, ...[23,1]) --> 23

不是说我需要知道答案,而是我也想知道。你根本没有提出任何论点
-Infinity
Math.max()
的起点,因此没有参数就是答案。from:如果没有参数,结果是
-Infinity。
请注意
Math.max([])
0
,因为
数字([])0
。如果适用(即您希望默认值为“0”),尝试
Math.max(0,…[])
但结果是负无穷大,而不是正。@Pointy-Hmm。。有趣的是,即使我调用
Math.max()
,它也给了我-
无穷大。我想文档中一定有打字错误。让我看看最近的文档。在您链接的文档中,它清楚地显示
-∞。正无穷大是当您不传递任何参数时从
Math.min()
返回的值。@Pointy Uff。。对不起,伙计。。我只是糊涂了。我链接了一个与min相关的文档。更正并更新了答案。谢谢你的指点,虽然很尖锐;)