前面在看題目的時候 偶然看到 使用parseInt 來進行整數判斷 但是這裡的parseInt是錯誤示範 之後瞭解了一下 發現這和函數 很有研究 先看看 w3c怎麼說這個的 說實話 雖然我沒有比較好的描述,但是覺的他的解釋並不好 看不懂 我們來看看當沒有 radix這個參數的時候 parseIn ...
前面在看題目的時候 偶然看到 使用parseInt 來進行整數判斷 但是這裡的parseInt是錯誤示範
之後瞭解了一下 發現這和函數 很有研究
先看看 w3c怎麼說這個的
parseInt() 函數可解析一個字元串,並返回一個整數。
string 必需。要被解析的字元串。
radix
可選。表示要解析的數字的基數。該值介於 2 ~ 36 之間。
如果省略該參數或其值為 0,則數字將以 10 為基礎來解析。如果它以 “0x” 或 “0X” 開頭,將以 16 為基數。
如果該參數小於 2 或者大於 36,則 parseInt() 將返回 NaN。
說實話 雖然我沒有比較好的描述,但是覺的他的解釋並不好 看不懂
我們來看看當沒有 radix這個參數的時候 parseInt()是如何解析的
如果 string 以 "0x" 開頭,parseInt() 會把 string 的其餘部分解析為十六進位的整數
如果 string 以 0 開頭,那麼 ECMAScript v3 允許 parseInt() 的一個實現把其後的字元解析為八進位或十六進位的數字。
如果 string 以 1 ~ 9 的數字開頭,parseInt() 將把它解析為十進位的整數。
以及註意事項
註釋:只有字元串中的第一個數字會被返回。
註釋:開頭和結尾的空格是允許的。
提示:如果字元串的第一個字元不能被轉換為數字,那麼 parseFloat() 會返回 NaN。
實例
parseInt('12',10) //10
parseInt(11,2,10) //3 只解析前兩位 這裡將 11 轉化為2禁止 也就是 0011 也就是 3
parseInt( 11 ,2) //3 空格不影響結果
parseInt("dasas",2) // NaN 運算發生錯誤
接下來讓我們看看 為什麼 parseInt不適合判斷是否整數
parseInt(0.000001, 10) // 0
parseInt(0.0000001, 10) //1 為什麼會是1 !
parseInt(10000000000000,10) //10000000000000
parseInt(10000000000000000000000000000,10) // 1
因為 0.0000001 會被科學計算轉化為1e-7 於是parseInt就進行識別 1 認識 e不認識 返回 10進位的1 結果為 1
10000000000000000000000000000 => 1e+28 所以為1
所有 這裡數字過小 過大就不再適合 使用parseInt來進行判斷
拓展
console.log(parseInt(1/0,19)) //18
console.log(parseInt(false,16)) //250
console.log(parseInt(parseInt,16)) //15
console.log(parseInt('0x10')) //16
console.log(parseInt('10',2)) //2
這是我在別人博客看到的 這些都會了 parseInt就沒問題了
解釋
console.log(parseInt(1/0,19))
首先計算 1/0 多少 控制台輸出 Infinity
代碼就變成了
parseInt("Infinity",19)
19進位 ( 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i )
進行解析 I 存在 19進位 解析為18 n不存在 直接返回 所以 = 18
console.log(parseInt(false,16))
18進位 (0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f)
false parseInt不認識 於是 逐個解析
f 存在 a 存在 l不認識返回 16進位的fa = > 10進位的 250
console.log(parseInt(parseInt,16))
和上面同理 parseInt被解析成為字元串
console.log(parseInt('0x10'))
沒有第二參數 預設 10進位 0x 表示 16進位 0x10為 10 10進位為 => 16
console.log(parseInt('10',2))
10 二進位 解析 => 2