看完《你不知道的JavaScript(中冊)》強制類型轉換一章後,發現一個好玩的題目ui
console.log(parseInt( 1/0, 19 ))
// 18
複製代碼
你沒看錯,結果是18 😂.spa
又想起以前的一道網紅題code
爲何
['1', '7', '11'].map(parseInt)
返回[1, NaN, 3]
cdn
這些看似莫名其妙的結果,其中隱含的就是咱們對 parseInt
缺少進一步的瞭解。書上已經給出瞭解析,這裏我作一個稍微的提煉,分享給你們。blog
那道網紅題網上有各類解析,你們能夠自行搜索查看。這裏我主要解析文章開始的那道題。ip
parseInt
用於將字符串強制類型轉換爲數字。解析容許字符串中含有非數字字符,解析按從左到右的順序,若是遇到非數字字符就中止。而轉換不容許出現非數字字符,不然會失敗並返回 NaN。字符串
console.log(parseInt('10px'))
console.log(parseInt('width10px'))
// 10
// NaN
複製代碼
基本用法沒什麼好分析的,咱們看下一個 🌰string
console.log(parseInt('12'))
console.log(parseInt('12', 2))
console.log(parseInt('12', 5))
// 12
// 1
// 7
複製代碼
上面的代碼中, parseInt
加入了第二個參數,看過網紅題解析的同窗應該都知道第二個參數表示基數,即第一個參數基於幾進制進行解析。it
基數的範圍爲2~36,若是第一個參數的字符沒法使用基數解析,則中止解析。若是第二個參數不在2~36範圍中,則 parseInt
直接返回NaN。io
上面的例子中, parseInt(12, 2)
的結果爲 1
,緣由是第二個字符 2
沒法被解析成二進制值,因此中斷解析,返回 1
。
再看一下第一個參數徹底沒法解析和基數超出範圍的狀況
console.log(parseInt('12', 1))
// NaN
console.log(parseInt('34', 2))
// NaN
複製代碼
上面的例子沒什麼好分析的,結合注意點一看就懂。😁
說了這麼多,尚未進入正題,文章開頭的題目是爲何
進入正題
parseInt是用於解析字符串的!若是第一個參數傳入非字符串,那麼它會被自動轉換成字符串再進行解析。
再看一遍文章開始的題目
console.log(parseInt( 1/0, 19 ))
// 18
複製代碼
首先1/0
結果爲 Infinity
,轉換成字符串就是 'Infinity'
, 因此上面的代碼能夠當作
console.log(parseInt('Infinity', 19))
複製代碼
等等,你們第一反應多是
第一個參數是非數字,結果應該是NaN
你們別忘了,第二個參數是 19
,此時第一個參數按 19
進制解析的。19
進制 什麼概念... A B C D E F G H I
是有意義的,分別表示 10 11 12 13 14 15 16 17 18
。
有沒有種恍然大明白的感受 😄
Infinity
按 19
進制解析,第一個字符 I
被解析成 18
,第一個字符 n
沒法被解析,中斷執行,返回18。
嗯... 知道答案後,頓時索然無味
什麼,還不夠? 那再來看幾道題
parseInt( 0.0000008 );
parseInt( false, 16 );
parseInt( parseInt, 16 );
parseInt( "0x10" );
// 8
// 250
// 15
// 16
複製代碼
索然無味以後是否是又一頓抽搐😄,確定又在想 parseInt
真的使人絕望。
可是!parseInt
表示這個鍋我不背,須要注意的點上面都已經列出來了,剩下的就是JavaScript其餘坑的問題了。
這裏仍是對上面的4道題作一個簡單的提示吧,你們能夠根據提示自行理解,有問題歡迎留言討論。
console.log(0.0000008.toString())
// 8e-7
console.log(false.toString())
// 'false'
console.log(parseInt.toString())
// function parseInt() { [native code] }
// 0x開頭的數字會被按16進制解析
複製代碼