JavaScript Map Reduce:奇怪的行为

JavaScript Map Reduce:奇怪的行为,javascript,mapreduce,Javascript,Mapreduce,我不明白为什么第二种形式不起作用。欢迎任何解释 编辑:技术背景:Chrome和Firefox JavaScript引擎。请参见ES5 REDUCT接受多个参数。这与不适用于parseInt或其他类似函数的原因完全相同。您需要自己绑定参数 reduce将index和array等值馈送到Math.min 如果我们遵循以下步骤,我们可以确认这一点: 首先,我们代理Math.min: var t = [-12, 57, 22, 12, -120, -3]; t.map(Math.abs).reduce

我不明白为什么第二种形式不起作用。欢迎任何解释

编辑:技术背景:Chrome和Firefox JavaScript引擎。请参见ES5 REDUCT接受多个参数。这与不适用于
parseInt
或其他类似函数的原因完全相同。您需要自己绑定参数

reduce将
index
array
等值馈送到
Math.min

如果我们遵循以下步骤,我们可以确认这一点:

首先,我们代理Math.min:

var t = [-12, 57, 22, 12, -120, -3];

t.map(Math.abs).reduce(function(current, previousResult) {
    return Math.min(current, previousResult);
}); // returns 3

t.map(Math.abs).reduce(Math.min); // returns NaN
然后我们运行第二个版本:

var oldMath = Math.min;
Math.min = function (){
   console.log(arguments)
   return oldMath.apply(Math, arguments);
}
哪些日志:

[-12, 57, 22, 12, -120, -3].reduce(Math.min);
由于数组[6]不是数字,因此结果为NaN


以下是来自MDN的一个非常类似的示例:

[-12, 57, 1, Array[6]]
而人们可以预期[1,2,3] 实际结果是[1,NaN,NaN]

parseInt
通常与一个参数一起使用,但需要两个参数。第二个是基数 Array.prototype.map向回调函数传递3个参数:元素、索引和数组 parseInt忽略第三个参数,但不忽略第二个参数,因此可能会产生混淆。

的回调调用传递四个参数:
previousValue
currentValue
index
数组
。因为是一个函数,所以您的代码:

["1", "2", "3"].map(parseInt);
相当于:

t.map(Math.abs).reduce(Math.min); // returns NaN
这就是为什么结果是
NaN
:最后一个参数
array
,不是一个数字

您也可以使用类似的解决方案来解决此类问题:

t.map(Math.abs).reduce(function(current, previousResult, index, array) {
  return Math.min(current, previousResult, index, array);
});
然后:

function binary (fn) {
  return function (a, b) {
     return fn.call(this, a, b);
  }
}
将起作用。

这是“在浏览器中”,我更新了我的答案。@AsTeR:具体来说,是的,它还没有广泛实施。
t.map(Math.abs).reduce(binary(Math.min));