問題
利用
map()把字串陣列映射成整數陣列
["1", "2", "3"].map(parseInt);
是不是覺得結果應該回傳 [1, 2, 3]?
但是事與愿違,結果是:
Output:
[1, NaN, NaN]
為什么呢?
回顧
parseInt
parseInt() 函式決議一個字串引數,并回傳一個指定基數的整數
const intValue = https://www.cnblogs.com/touryung/archive/2023/02/22/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);
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/544773.html
標籤:其他
下一篇:js截取陣列
