簡體   English   中英

JavaScript Map Reduce:奇怪的行為

[英]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或其他類似函數不起作用的原因完全相同。 你需要自己綁定參數。

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忽略,但不是第二個參數,因此可能會產生混淆。

reduce的回調被稱為傳遞四個參數: previousValuecurrentValueindexarray 因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM