[英]JavaScript Map Reduce: weird behavior
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
或其他類似函數不起作用的原因完全相同。 你需要自己綁定參數。
將index
和array
類的值減少到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忽略,但不是第二個參數,因此可能會產生混淆。
reduce的回調被稱為傳遞四個參數: previousValue
, currentValue
, index
和array
。 因為Math.min是一個可變函數,你的代碼:
t.map(Math.abs).reduce(Math.min); // returns NaN
相當於:
t.map(Math.abs).reduce(function(current, previousResult, index, array) {
return Math.min(current, previousResult, index, array);
});
這就是為什么結果是NaN
:最后一個參數, array
,不是數字。
您還可以使用如下所示的高階函數來解決此類問題:
function binary (fn) {
return function (a, b) {
return fn.call(this, a, b);
}
}
接着:
t.map(Math.abs).reduce(binary(Math.min));
會有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.