JS面試題解['1',?'7',?'11'].map(parseInt)?輸出
輸出結果
['1', '7', '11'].map(parseInt) // 結果輸出 -> [1, NaN, 3]
為什么輸出會有 NaN ? 為什么把 11 轉成整數會是 3 ?
想把數組里的字符串數字轉換成整數,于是使用 map函數來對數組的每一項作用,作用的函數是 parseInt函數,所以預期的結果應該是[1,7,11] ,然而最終瀏覽器的 JavaScript 引擎給出的答案是 [1, NaN, 3] 。
從結果可以看到 1 是正常進行轉化的,后面兩個數則不是我們預期的結果。
map函數有問題?
現(xiàn)在我們把 parseInt 換掉,功能改為給每一個數乘 2
['1', '7', '11'].map(function(x){
return x * 2; // 結果 -> [2, 14, 22]
});
發(fā)現(xiàn)結果是正常的,x代表從數組里拿到的每一個值,在依次去乘以2 ,沒問題。
可是問題來了,除了x,會不會有其它參數,存不存在其它可以使用的參數。于是我們試驗下:
['1', '7', '11'].map(function(x, i, j, k){
console.log(x +' ' + i + ' ' + j + ' ' + k);
});
在 Chrome 的控制臺執(zhí)行后發(fā)現(xiàn)結果出乎意料

也就是說,map 接受的這個函數,它存在三個參數,第一個是數組當前的值,第二個是當前值的索引,第三個數是當前傳入的數組
會不會是傳入的 parseInt 出現(xiàn)問題 ?
當我們傳入 parseInt 時,map 函數會把三個參數(數組當前元素,當前元素的索引,當前傳入的數組)一并打包給 parseInt 。
那么現(xiàn)在問題就集中在 parseInt 函數上面。
從 MDN 文檔查詢后可以知道,parseInt(string, radix) 函數接受兩個參數,第一個是需要轉換的字符串,第二個是進制。
于是結果呼之欲出,我把這個過程畫成了圖,方便看圖理解,

首先,parseInt 接受兩個參數,因此第三個參數會被忽略。
第一次執(zhí)行, parseInt('1', 0) 會輸出 1 ,因為 0 會轉換成 false,而 false 會使它執(zhí)行默認的進制 10 ,就是 parseInt 默認都是轉換十進制;
第二次執(zhí)行,parseInt('7', 1) 因為沒有所謂的 1 進制,所以無法轉換,輸出 NaN;
第三次執(zhí)行parseInt('11', 2) 答案為 3 ,因為以 2 為進制轉換,3 的二進制是 11 , 非常的巧妙。
所以最終的輸出的結果就是 [1, NaN, 3]
以上就是JS面試題解['1', '7', '11'].map(parseInt) 輸出的詳細內容,更多關于JS面試題 的資料請關注腳本之家其它相關文章!
相關文章
JavaScript前端迭代器Iterator與生成器Generator講解
這篇文章主要為大家介紹了JavaScript前端迭代器Iterator與生成器Generator講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

