为什么在这种情况下不能使用Math.max作为参数?

Pab*_*ano 6 javascript lambda

我在示例中使用Math.max 回答了一个与Array.reduce有关问题,但发现了一些我不理解的东西:

这有效:

let values=[4,5,6,77,8,12,0,9];

let max=values.reduce((acc,curr) => Math.max(acc,curr),0);

console.log(max);
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试这样的事情:

let values=[4,5,6,77,8,12,0,9];

let max=values.reduce(Math.max,0);

console.log(max);
Run Code Online (Sandbox Code Playgroud)

它返回NaN。

我认为上下文是原因,因此我写了以下内容:

let max=Math.max;
console.log(max(2,5));
Run Code Online (Sandbox Code Playgroud)

但它按预期工作!

我想念什么?MDN表示

如果至少一个参数不能转换为数字,则返回NaN。

And*_*son 5

您所缺少的是,的回调reduce具有比累加器和当前数组值更多的参数。它实际上有4。

请参阅文档:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Description

四个参数

accumulator
currentValue
currentIndex
array (a reference to the array itself)
Run Code Online (Sandbox Code Playgroud)

问题是第四个参数,reduce调用的是数组本身。Math.max无法处理数组,因此返回NaN

编辑:相反,您可以使用apply方法或新的价差运算符!

let values = [4,5,6,77,8,12,0,9];
let max = Math.max.apply(null, values);
let maxAnotherWay = Math.max(...values);
Run Code Online (Sandbox Code Playgroud)

或者,如果你碰巧使用Lodash,该_.ary方法可以让你换功能,限制它的另一个功能参数数量

let values = [4,5,6,77,8,12,0,9];
let max = values.reduce(_.ary(Math.max, 2),0);
Run Code Online (Sandbox Code Playgroud)