2013-06-30 90 views
2

有人可以解釋爲什麼這有意想不到的結果:意外的 「地圖」 的結果(JavaScript)的

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

返回[1大,NaN,NaN的]而不是[1,2,3]

我可以把它迫使一個單參數函數工作:

["1", "2", "3"].map(function(s) {return parseInt(s);}); 

,但我不知道究竟是什麼地方出了問題的第一種方式。

回答

1

本文在最後一個示例中描述了您的問題,與您嘗試執行的操作完全相同。然而,他們所指的博客文章不再存在。

array.map() and parseInt callback

更好的答案應該從Stackoverflow引:

所以,如果你實際上需要兩個參數的函數,則 第二個參數將是元素的索引。

在這種情況下,您最終在 回合中調用了基數爲0,1和2的parseInt。第一個是一樣不提供該參數,所以它 默認爲基座10基1是一個不可能的數量的基礎上,和3是 不是在基體2的有效號碼:

parseInt('1', 0); // OK - gives 1 
parseInt('2', 1); // FAIL - 1 isn't a legal radix 
parseInt('3', 2); // FAIL - 3 isn't legal in base 2 
1

parseInt取兩個參數(第二個是基數),這就是爲什麼這不起作用。有關更多信息,請參見此MDN page的底部。引用:

parseInt通常與一個參數一起使用,但需要兩個參數。第二個 是基數對於回調函數,Array.prototype.map傳遞3 自變量:元素,索引,數組。第三個參數是 parseInt忽略,但不是第二個,因此可能的 混淆。

2

正如其他人所說,問題是由於第二個參數。從MDN

評論:

// parseInt is often used with one argument, but takes two. The second being the radix 
// To the callback function, Array.prototype.map passes 3 arguments: the element, the index, the array 
// The third argument is ignored by parseInt, but not the second one, hence the possible confusion. 
// See the blog post for more details 

但是,隨着使用bind,就可以達到預期的效果:

var _parseInt = function(radix, number) { 
    return parseInt(number, radix); 
} 
["1", "2", "3"].map(_parseInt.bind(this, 10));