JS面試題解['1',?'7',?'11'].map(parseInt)?輸出
輸出結(jié)果
['1', '7', '11'].map(parseInt) // 結(jié)果輸出 -> [1, NaN, 3]
為什么輸出會有 NaN
? 為什么把 11
轉(zhuǎn)成整數(shù)會是 3
?
想把數(shù)組里的字符串?dāng)?shù)字轉(zhuǎn)換成整數(shù),于是使用 map函數(shù)來對數(shù)組的每一項(xiàng)作用,作用的函數(shù)是 parseInt函數(shù),所以預(yù)期的結(jié)果應(yīng)該是[1,7,11]
,然而最終瀏覽器的 JavaScript 引擎給出的答案是 [1, NaN, 3]
。
從結(jié)果可以看到 1 是正常進(jìn)行轉(zhuǎn)化的,后面兩個數(shù)則不是我們預(yù)期的結(jié)果。
map函數(shù)有問題?
現(xiàn)在我們把 parseInt
換掉,功能改為給每一個數(shù)乘 2
['1', '7', '11'].map(function(x){ return x * 2; // 結(jié)果 -> [2, 14, 22] });
發(fā)現(xiàn)結(jié)果是正常的,x
代表從數(shù)組里拿到的每一個值,在依次去乘以2
,沒問題。
可是問題來了,除了x
,會不會有其它參數(shù),存不存在其它可以使用的參數(shù)。于是我們試驗(yàn)下:
['1', '7', '11'].map(function(x, i, j, k){ console.log(x +' ' + i + ' ' + j + ' ' + k); });
在 Chrome
的控制臺執(zhí)行后發(fā)現(xiàn)結(jié)果出乎意料
也就是說,map
接受的這個函數(shù),它存在三個參數(shù),第一個是數(shù)組當(dāng)前的值,第二個是當(dāng)前值的索引,第三個數(shù)是當(dāng)前傳入的數(shù)組
會不會是傳入的 parseInt 出現(xiàn)問題 ?
當(dāng)我們傳入 parseInt
時,map
函數(shù)會把三個參數(shù)(數(shù)組當(dāng)前元素,當(dāng)前元素的索引,當(dāng)前傳入的數(shù)組)一并打包給 parseInt
。
那么現(xiàn)在問題就集中在 parseInt
函數(shù)上面。
從 MDN
文檔查詢后可以知道,parseInt(string, radix)
函數(shù)接受兩個參數(shù),第一個是需要轉(zhuǎn)換的字符串,第二個是進(jìn)制。
于是結(jié)果呼之欲出,我把這個過程畫成了圖,方便看圖理解,
首先,parseInt 接受兩個參數(shù),因此第三個參數(shù)會被忽略。
第一次執(zhí)行, parseInt('1', 0) 會輸出 1 ,因?yàn)?0 會轉(zhuǎn)換成 false,而 false 會使它執(zhí)行默認(rèn)的進(jìn)制 10 ,就是 parseInt 默認(rèn)都是轉(zhuǎn)換十進(jìn)制;
第二次執(zhí)行,parseInt('7', 1) 因?yàn)闆]有所謂的 1 進(jìn)制,所以無法轉(zhuǎn)換,輸出 NaN;
第三次執(zhí)行parseInt('11', 2) 答案為 3 ,因?yàn)橐?2 為進(jìn)制轉(zhuǎn)換,3 的二進(jìn)制是 11 , 非常的巧妙。
所以最終的輸出的結(jié)果就是 [1, NaN, 3]
以上就是JS面試題解['1', '7', '11'].map(parseInt) 輸出的詳細(xì)內(nèi)容,更多關(guān)于JS面試題 的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Proxy的不可變數(shù)據(jù)優(yōu)點(diǎn)及使用詳解
這篇文章主要為大家介紹了Proxy的不可變數(shù)據(jù)優(yōu)點(diǎn)及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Skypack布局前端基建實(shí)現(xiàn)過程詳解
這篇文章主要為大家介紹了Skypack布局前端基建過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07next.js源碼解析getStaticProps?getStaticPaths使用場景
這篇文章主要為大家介紹了next.js源碼解析getStaticProps?getStaticPaths使用場景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08autojs使用intent發(fā)送郵件帶附件實(shí)現(xiàn)示例
這篇文章主要為大家介紹了autojs使用intent發(fā)送郵件帶附件實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01