JavaScript 映射减少 : weird behavior

标签 javascript mapreduce

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

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

编辑:技术背景:Chrome 和 Firefox JavaScript 引擎。参见 ES5 减少 http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.21

最佳答案

Math.min接受多个参数。这与它对 parseInt 或其他类似函数不起作用的原因完全相同。需要自己绑定(bind)参数。

reduce 将 indexarray 等值提供给 Math.min

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

首先,我们代理 Math.min:

var oldMath = Math.min;
Math.min = function (){
   console.log(arguments)
   return oldMath.apply(Math, arguments);
}

然后我们运行第二个版本:

[-12, 57, 22, 12, -120, -3].reduce(Math.min);

哪些日志:

[-12, 57, 1, Array[6]]

因为 Array[6] 不是数字,所以结果是 NaN


这是来自 MDN 的一个非常相似的例子:

["1", "2", "3"].map(parseInt);

虽然人们可以期待 [1, 2, 3] 实际结果为[1, NaN, NaN]

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

关于JavaScript 映射减少 : weird behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799005/

相关文章:

hadoop - hadoop中local和yarn的区别

hadoop - Hadoop fs -ls引发错误

java - MapReduce 扫描 HBase 时,Reducer 的个数始终为一个

javascript - Facebook JavaScript SDK : Read App URL

javascript - 设置超时或设置间隔?

hadoop - Mapreduce和GlobStatus中的Null Pointer异常

java - 在 Hadoop 中设置可写?

javascript - jQuery ajax 不显示和隐藏加载器 div

javascript - 通过数组中每个 JSON 对象中的值从 JSON 数组中删除重复项

javascript - 字符串到对象字面量