絕望之parseInt

看完《你不知道的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

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

有沒有種恍然大明白的感受 😄

解析

Infinity19 進制解析,第一個字符 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進制解析
複製代碼
相關文章
相關標籤/搜索