開門見山,我們先來看兩個例子。
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)});
