問題 利用 map() 把字元串數組映射成整數數組 ["1", "2", "3"].map(parseInt); 是不是覺得結果應該返回 [1, 2, 3]? 但是事與願違,結果是: Output: [1, NaN, NaN] 為什麼呢? 回顧 parseInt parseInt() 函數解析一個字 ...
問題
利用
map()
把字元串數組映射成整數數組
["1", "2", "3"].map(parseInt);
是不是覺得結果應該返回 [1, 2, 3]
?
但是事與願違,結果是:
Output:
[1, NaN, NaN]
為什麼呢?
回顧
parseInt
parseInt()
函數解析一個字元串參數,並返回一個指定基數的整數
const intValue = parseInt(string[, radix]);
string
:要被解析的值。如果參數不是一個字元串,則將其轉換為字元串(使用 toString 抽象操作)。字元串開頭的空白符將會被忽略。
radix
:一個介於 2 和 36 之間的整數,表示上述字元串的基數,預設為 10。
返回值
:返回一個整數或 NaN。
parseInt("100"); // 100
parseInt("100", 10); // 100
parseInt("100", 2); // 4,將 100 看作二進位,轉化成十進位
在 radix
為 undefined
,0 或者沒有指定的情況下,JavaScript 作如下處理:
- 如果字元串
string
以 "0x" 或者 "0X" 開頭, 則基數是 16 - 如果字元串
string
以 "0" 開頭, 基數是 8 或者 10,具體是哪個基數由實現環境決定。ECMAScript 5 規定使用 10,但是並不是所有的瀏覽器都遵循這個規定。因此,永遠都要明確給出 radix 參數的值 - 如果字元串
string
以其它任何值開頭,則基數是 10
map
map()
方法創建一個新數組,其結果是該數組中的每個元素都調用一個提供的函數後返回的結果。
var new_array = arr.map(function callback(currentValue[,index[, array]]) {
// Return item for new_array
}[, thisArg])
可以看到 callback
回調函數需要三個參數, 我們通常只使用第一個參數 (其他兩個參數是可選的)。
currentValue
是數組中正在處理的當前元素。index
可選,是數組中正在處理的當前元素的索引。array
可選, 是調用 map 方法的數組。- 另外還有
thisArg
可選, 可指定執行callback
函數時使用的 this 值。
[1, 2, 3].map((num) => num + 1); // [2, 3, 4]
原因
['1', '2', '3'].map(parseInt)
對於 map
的每次迭代, parseInt()
傳遞兩個參數: 字元串和基數。 所以實際執行的的代碼是:
['1', '2', '3'].map((item, index) => {
return parseInt(item, index)
})
每次的迭代展開為:
// 上面說過,radix 為 0 時,string 以其它任何值開頭,則基數是 10
parseInt("1", 0); // 1
// 沒有一進位
parseInt("2", 1); // NaN
// 3 不是二進位
parseInt("3", 2); // NaN
解決辦法
- Number
不使用 parseInt
方法,使用 Number
方法,原因是 Number
方法只有一個形參,不存在上述問題
['1', '2', '3'].map(Number);
- 自定義
和第一種方法差不多,都是將傳入 callback
函數改為一個參數
['1', '2', '3'].map((value)=>{
return parseInt(value);
})