JavaScript减less不能处理math函数?

我正在尝试一个明显的任务:

var maxVal = [ 1, 2, 3, 4, 5 ].reduce( Math.max, 0 ); 

并得到:

 NaN 

作为结果。 为了使其工作,我必须这样做一个匿名函数:

 var maxVal = [ 1, 2, 3, 4, 5 ].reduce( function ( a, b ) { return Math.max(a, b); }, 0 ); 

有人能告诉我为什么吗? 这两个函数都带有两个参数,都返回一个值。 有什么不同?

另一个例子可能是这样的:

 var newList = [[1, 2, 3], [4, 5, 6]].reduce( Array.concat, [] ); 

结果是:

 [1, 2, 3, 0, #1=[1, 2, 3], #2=[4, 5, 6], 4, 5, 6, 1, #1#, #2#] 

我可以在node.js中只在这个形状下运行这个例子(在node.js v4.12中Array没有concat,我现在使用它):

 var newList = [[1, 2, 3], [4, 5, 6]].reduce( [].concat, [] ); 

然后得到这个:

 [ {}, {}, 1, 2, 3, 0, [ 1, 2, 3 ], [ 4, 5, 6 ], 4, 5, 6, 1, [ 1, 2, 3 ], [ 4, 5, 6 ] ] 

为什么是这样?

传递给reduce的函数需要2个以上的参数 :

  • previousValue
  • currentValue
  • index
  • array

Math.max将评估所有参数并返回最高值:

 Math.max(1, 2, 3, 4) === 4; 

所以在传递Math.max情况下,它会返回4个参数中的最高值,其中一个是数组。 传递数组将使Math.max返回NaN因为数组不是数字。 这是在规格(15.8.2.11):

给定零个或多个参数,在每个参数上调用ToNumber,并返回最大的结果值。

如果有任何值是NaN,那么结果是NaN

ToNumber将为数组返回NaN

所以用Math.max减less最终会返回NaN

由于Math.max接受多个参数,因此可以通过apply函数将数组转换为参数列表。

 var maxVal = Math.max.apply(Math, [ 1, 2, 3, 4, 5 ]); 

这里看到有关这种技术的限制的警告 。

另一种方法来减less数组的最大值:

 var maxVal = [ 1, 2, 3, 4, 5 ].reduce(function(a,b){return a>b?a:b}); 

(说明如何减less工作,而不是从数组中获得最大数量的最佳方式)