關於Array的map方法中回調函數參數的問題


開門見山,我們先來看兩個例子。

var arr=['1','4','9','16'];

var r=arr.map(Math.sqrt);

猜猜r的結果會是多少?

沒錯就是

[1,2,3,4]

我們再來試試另一個,

var arr=['1','4','9','16'];

var r=arr.map(parseInt);

再猜猜結果是多少?

是[1,4,9,16]?

console試一試看看結果是多少

[1,NaN,NaN,1]!

是不是大吃一驚

其實真相————

就是參數個數搞的鬼!

讓我們再來看一個例子

var arr=['1','4','9','16'];

var r=arr.map(function(x){return parseInt(x)});

r//[1,4,9,16]

結果是不是就正常了!

其實在調用

arr.map(parseInt);的時候

傳給map的參數有三個

當前的值(currentValuve)//依次是'1','4','9','16'

當前值的索引(currentIndex)//依次是0,1,2,3

以及當前數組(currentArray)//['1','4','9','16'],每次都是這個

而每次使用parseInt()函數的時候,卻只傳入了兩個值(currentValue,currentIndex)

所以結果就是:

parseInt('1',0)//1

而第二個參數假如經過 Number 函數轉換后為 0 或 NaN,則將會忽略。——Mozilla官方文檔

parseInt('4',1)//非法,NaN

parseInt('9',2)//非法,NaN

parseInt('16',3)//這里值得注意,在解析字符串'16'的時候,發現6大於或等於3,所以其后的數字都被忽略,只剩下一個1返回了

如果 parseInt 遇到了不屬於radix參數所指定的基數中的字符那么該字符和其后的字符都將被忽略。——Mozilla官方文檔

最后知道真相的我們以后可千萬得注意map函數中回調參數個數的問題啊!

var r=arr.map(function(x){return parseInt(x)});


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM