寫在前面
此系列來源于開源項目:前端 100 問:能搞懂 80%的請把簡歷給我
為了備戰(zhàn) 2021 春招
每天一題音同,督促自己
從多方面多角度總結(jié)答案,豐富知識
['1', '2', '3'].map(parseInt) what & why ?
正文回答
回顧一下,map 函數(shù)的第一個參數(shù) callback
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])
這個 callback 一共可以接收三個參數(shù)
第一個參數(shù) currentValue
代表【當前被處理的元素】
第二個參數(shù) index
代表【該元素的索引】
第三個參數(shù) array
【調(diào)用的數(shù)組】
const arr = [1, 2, 3];
arr.map((num) => num + 1); // [2, 3, 4]
parseInt
則是用來解析字符串的骇吭,使字符串成為指定基數(shù)的整數(shù)
parseInt(string, radix)
接收兩個參數(shù)
第一個表示【被處理的值(字符串)】
第二個表示為【解析時的基數(shù)】
parseInt(100); // 100
parseInt(100, 10); // 100
parseInt(100, 2); // 4 -> 將以2為基數(shù)的100轉(zhuǎn)換為以10為基數(shù)的值
在 radix
為 undefined
,或者 radix
為 0
或者沒有指定的情況下封锉,JavaScript 作如下處理:
- 如果字符串
string
以"0x"或者"0X"開頭, 則基數(shù)是 16 (16 進制). - 如果字符串
string
以"0"開頭, 基數(shù)是 8(八進制)或者 10(十進制)绵跷,那么具體是哪個基數(shù)由實現(xiàn)環(huán)境決定。ECMAScript 5 規(guī)定使用 10成福,但是并不是所有的瀏覽器都遵循這個規(guī)定碾局。因此,永遠都要明確給出radix
參數(shù)的值奴艾。 - 如果字符串
string
以其它任何值開頭净当,則基數(shù)是 10 (十進制)。 - 該值介于 2 ~ 36 之間
解析題目
實際執(zhí)行的代碼:
["1", "2", "3"].map((item, index) => {
return parseInt(item, index);
});
parseInt("1", 0); // 1
parseInt("2", 1); // NaN
parseInt("3", 2); // NaN, 3 不是二進制
對函數(shù)解析的 MSN 的說明鏈接
詳見parseInt
題目變形
let unary = (fn) => (val) => fn(val);
let parse = unary(parseInt);
console.log(["1.1", "2", "0.3"].map(parse));
//[1, 2, 0]
["10", "10", "10", "10", "10"].map(parseInt);
// [10, NaN, 2, 3, 4]
["10", "10", "10", "10", "10"].map(Number);
// [10, 10, 10, 10, 10]
["1", "2", "3"].map((n) => parseInt(n, 10));
// [1, 2, 3]