爲何["1", "2", "3"].map(parseInt) 爲 1,NaN,NaN;javascript
parseInt()
函數可解析一個字符串,並返回一個整數。java
parseInt(string, radix)
參數 | 描述 |
---|---|
string | 必需。要被解析的字符串。 |
radix | 可選。表示要解析的數字的基數。該值介於 2 ~ 36 之間。數組 若是省略該參數或其值爲 ‘0‘,則數字將以 10 爲基礎來解析。若是它以 ‘」0x」‘ 或 ‘」0X」‘ 開頭,將以 16 爲基數。函數 若是該參數小於 2 或者大於 36,則 ‘parseInt()‘ 將返回 ‘NaN‘。ui |
對數組的每一個元素調用定義的回調函數並返回包含結果的數組。this
array.map(callbackfn, thisArg])
參數 | 定義 |
---|---|
array | 必需。一個數組對象。 |
callbackfn | 必需。一個接受**最多**三個參數的函數。對於數組中的每一個元素,‘map‘ 方法都會調用 ‘callbackfn‘ 函數一次。 |
thisArg | 可選。可在 ‘callbackfn‘ 函數中爲其引用 ‘this‘ 關鍵字的對象。若是省略 ‘thisArg‘,則 ‘undefined‘ 將用做 ‘this‘ 值。 |
回調函數的語法以下所示:spa
function callbackfn(value, index, array)
回調參數 | 定義 |
---|---|
value | 數組元素的值。 |
index | 數組元素的數字索引。 |
array1 | 包含該元素的數組對象。 |
如今回到最初的問題,code
["1", "2", "3"].map(parseInt) 其實是這麼調用的:對象
parseInt('1',0,["1", "2", "3"]); blog
parseInt('2',1,["1", "2", "3"]);
parseInt('3',2,["1", "2", "3"]);
JS函數通常會自動忽視多餘的參數,parseInt僅僅須要兩個參數,因此咱們並不須要擔憂第三個參數array參數對parseInt的影響。
那麼第二個參數是如何影響parseInt的?
在第一次調用時,parseInt的第二個參數是0,上面已經說了,省略該參數或其值爲 ‘0‘,則數字將以 10 爲基礎來解析,因此parseInt('1',0)爲1;parseInt('2',1) 若是該參數小於 2 或者大於 36,則 ‘parseInt()‘ 將返回 ‘NaN‘。,則 parseInt('2',1)爲NaN;
parseInt('3',2)第一個string參數以2進制進行解析,而2進制只有0 1 組成,沒有3,因此 parseInt('3',2)爲NaN;
此問題解決方法
方法一:
['1','2','3'].map(function(value){ return parseInt(value) })
方法二:
['1','2','3'].map(Number)
延伸:
var a=["1", "2", "3", "4","5",6,7,8,9,10,11,12,13,14,15]; a.map(parseInt); // [1, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 9, 11, 13, 15, 17, 19]
由於
parseInt(10,9)//9 parseInt(11,10)//11 parseInt(12,11)//13 ...