[1, 2, 3].map(parseInt)的結(jié)果是什么
顯而易見的通殃,在該題目中有兩個JavaScript方法绰寞,一個是Array.prototype.map
,另一個是parseInt()
。
Array.prototype.map
首先是Array.prototype.map
方法只恨,這是ES5給出的數(shù)組實例的方法。給map傳入一個回調(diào)函數(shù)抬虽,map就會遍歷數(shù)組官觅,將相關(guān)信息一起傳入回調(diào)函數(shù),并取回這個回調(diào)函數(shù)的返回值作為新數(shù)組的對應(yīng)索引的元素阐污,并返回這個新數(shù)組休涤。
回調(diào)函數(shù)每次可以拿到三個值——(1)數(shù)組元素(2)索引值(3)數(shù)組本身
[1, 2, 3].map((value, index, array)) => {
return value * 2
} // [2, 4, 6]
注:傳遞給map()的函數(shù)的調(diào)用方式和傳遞給forEach()的函數(shù)的調(diào)用方式一樣,但傳遞給map()的函數(shù)應(yīng)該要有返回值笛辟。map()返回的是新數(shù)組功氨,它不修改調(diào)用數(shù)組。如果調(diào)用數(shù)組是稀疏數(shù)組手幢,則返回的數(shù)組也是稀疏數(shù)組——具有相同的長度和相同的缺失元素捷凄。
Array.prototype.map方法的底層實現(xiàn)
Array.prototype.myMap = function(callbackfn) {
const arr = this
const retArr = new Array(arr.length)
for (let i = 0; i < arr.length; i++) {
retArr[i] = callbackfn(arr[i], i, arr)
}
return retArr
}
parseInt
parseInt函數(shù)的作用是將第一個字符串轉(zhuǎn)換為數(shù)字,它接受兩個參數(shù)围来,第一個參數(shù)是我們需要轉(zhuǎn)換的字符串纵势,第二個參數(shù)是可選的踱阿,它代表字符串的基數(shù),即該參數(shù)表明我們需要通過幾進制去對這個字符串完成轉(zhuǎn)換钦铁,如2软舌,就代表字符串是用二進制表達的。如果我們省略第二個參數(shù)牛曹,當(dāng)字符串以0x
或0X
開頭佛点,它就會被當(dāng)作十六進制,否則被當(dāng)作十進制黎比。
特殊情況:當(dāng)parseInt的第二個參數(shù)為0時超营,相當(dāng)于第二個參數(shù)沒有傳,字符串會被當(dāng)成十進制阅虫,該情況也是最常用的情況演闭。
此外,當(dāng)字符串的第一個非空格字符無法轉(zhuǎn)換成數(shù)字時颓帝,也會返回NaN米碰。
下面給出一些例子:
parseInt('01', 2) // 1
parseInt('0xa') // 10
parseInt('123') // 123,常見用法
parseInt('3', 2) // NaN
回到題目
[1, 2, 3].map(parseInt)的parseInt
作為回調(diào)函數(shù)拿到了map提供的三個參數(shù)购城,得益于JavaScript是弱類型語言吕座,所以傳參數(shù)量不匹配也不會報錯,只會把不用的參數(shù)拋棄掉瘪板,將缺少的參數(shù)設(shè)置為undefined吴趴。
這里的parseInt只用到了兩個參數(shù),分別是數(shù)組元素和索引值侮攀。
實際上我們可以把題目展開成如下函數(shù):
const res = [1, 2, 3].map((item, index) => {
return parseInt(item, index)
})
如此便清晰明了了锣枝,我們很容易得到以下結(jié)果:
parseInt('1', 0)
// => 1 參數(shù)為0,等價于parseInt('1')
parseInt('2', 1)
// => NaN 參數(shù)為1兰英,沒有一進制這種東西
parseInt('3', 2)
// => NaN 參數(shù)為2撇叁,3無法用來表示二進制
所以最后我們得到返回結(jié)果:[1, NaN, NaN]
參考鏈接:
Web 前端陳年爛題:['1', '2', '3'].map(parseInt) 結(jié)果是什么? - 掘金 (juejin.cn)
解析 [1, 2, 3].map(parseInt)【JS面試題】_嗶哩嗶哩_bilibili