Math.max([])
将为0
而[..[]]
是[]
但为什么Math.max(...[])
在ES2015中等于-Infinity
?
答案 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