为什么Math.max(... [])在ES2015中等于-Infinity?

时间:2017-03-10 13:40:23

标签: javascript ecmascript-6

Math.max([])将为0

[..[]][]

但为什么Math.max(...[])在ES2015中等于-Infinity

5 个答案:

答案 0 :(得分:3)

如果您看到internal implementation文档,则可以告诉为什么Math.max在没有参数传递时返回-Infinity。

  

如果没有给出参数,则结果为-∞。

因此,当您在函数调用中传播空数组时,就像调用函数而没有参数。

答案 1 :(得分:3)

如果查看Math.max(...[])的babel输出,最终会得到Math.max.apply(Math, [])。如果你在ES5中记录它,你会发现由于某种原因它会给你-Infinity,因为它与没有参数的情况下调用它是一样的。

事实上,Math.max()给出-Infinity

如果您需要提醒:fn.apply( yourThis, [ a, b, c ] )fn( a, b, c )

相同

答案 2 :(得分:2)

因为Math.max(...[])不是Math.max([...[]])。在第一种情况下,您真正​​称之为Math.max(),即-Infinity。请参阅函数调用中的spread运算符 - https://developer.mozilla.org/cs/docs/Web/JavaScript/Reference/Operators/Spread_operator

答案 3 :(得分:2)

Math.max([])会发生什么?[]首先转换为字符串,然后转换为数字。它实际上并不被认为是一个参数数组。

使用Math.max(...[])数组被视为通过扩展运算符的参数集合。由于数组为空,这与不带参数的调用相同。 根据{{​​3}}产生-Infinity

  

如果没有给出参数,则结果为-Infinity。

一些示例显示使用数组调用的区别:



console.log(+[]); //0    [] -> '' -> 0
console.log(+[3]); //3    [] -> '3' -> 3
console.log(+[3,4]); //Nan 
console.log(...[3]); //3
console.log(...[3,4]); //3 4 (the array is used as arguments)
console.log(Math.max([])); //0  [] is converted to 0
console.log(Math.max()); // -infinity:  default without arguments
console.log(Math.max(...[])); // -infinity
console.log(Math.max([3,4])); //Nan
console.log(Math.max(...[3,4])); //4




答案 4 :(得分:0)

FTR克服此问题的方法是在扩展运算符中使用MIN值。喜欢:

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