關于JavaScript中parseInt()的一個怪異行為解決
parseInt()
是一個內置的 JavaScript
函數,它可以將數字字符串解析為整數。比如,我們將數字字符串 '100'
解析為整數:
const number = parseInt('100'); number; // 100
如預期那樣,'100'
被解析為整數 100
。
parseInt(numericalString, radix)
也接受第二個參數:radix
(基數),另一個參數是數字字符串 numericalString
。radix
參數允許你解析來自不同數字基數的字符串為整數,基數通常有 2,8, 10 和 16
。
我們使用基數為 2
的 parseInt()
來解析一個數字字符串:
const number = parseInt('100', 2); number; // 4
parseInt('100', 2)
以基數 2
解析 '100'
為一個整數:所以它返回十進制數值 4
。
上面就是對 parseInt()
方法的簡單介紹。
1. parseInt() 中的一個怪異行為
parseInt(numericalString)
總是將其第一個參數轉換成字符串(如果它不是字符串的話),然后將這個字符串數字解析成整數。
這就是為什么你可以(但是不應這么做! )使用 parseInt()
來提取浮點數的整數部分:
parseInt(0.5); // => 0 parseInt(0.05); // => 0 parseInt(0.005); // => 0 parseInt(0.0005); // => 0 parseInt(0.00005); // => 0 parseInt(0.000005); // => 0
取出浮點數,比如 0.5
,0.05
等等整數的部分。結果就是 0
。這跟我們的預期結果一樣。
那么提取 0.0000005
整數的部分會怎樣呢?
parseInt(0.0000005); // => 5
parseInt()
將浮點數 0.0000005
解析為 5
。這就很有趣且不符合預期...
為什么 parseInt(0.0000005)
會有如此怪異的行為呢?
2.解決 parseInt() 該怪異行為
我們回顧下,parseInt(numericalString)
對它的第一個參數做了什么:如果不是字符串,就將其轉換為一個字符串,然后解析,之后返回解析的整數。
這可能是第一個線索。
我們手動將浮點數轉換為字符串表現形式:
String(0.5); // => '0.5' String(0.05); // => '0.05' String(0.005); // => '0.005' String(0.0005); // => '0.0005' String(0.00005); // => '0.00005' String(0.000005); // => '0.000005' String(0.0000005); // => '5e-7'
String(0.0000005)
數值的顯式轉換和其它浮點數不同:它是指數符號exponential notation 字符串表現形式。
這是第二個線索 -- 很重要!
然后當指數符號字符串解析為整數,你就會得到整數 5
:
parseInt(0.0000005); // => 5 // same as parseInt(5e-7); // => 5 // same as parseInt('5e-7'); // => 5
parseInt('5e-7')
考慮第一個數字 '5'
,跳過了 'e-7'
。
解密了!因為 parseInt()
總是將它第一個參數轉換為字符串,浮點數字小于 10−610^{-6}10−6 就會被寫成指數符號的形式。parseInt()
從浮點數的指數符號中取出整數。
譯者加 -- 注意,
parseInt()
取字符串前面整數的部分,比如:parseInt('12Jimmy34')
則有返回結果12
備注,安全地取出浮點數整數的部分,我推薦使用 Math.floor()
函數:
Math.floor(0.5); // => 0 Math.floor(0.05); // => 0 Math.floor(0.005); // => 0 Math.floor(0.0005); // => 0 Math.floor(0.00005); // => 0 Math.floor(0.000005); // => 0 Math.floor(0.0000005); // => 0
3. 總結
parseInt()
是個將數字字符串轉換為整數的函數。
當你使用 parseInt()
獲取浮點數的整數部分的時候,要小心。
小于 10−610^{-6}10−6 的浮點數(比如 0.0000005
等同于 5∗10−75 * 10^{-7}5∗10−7)被轉換為以指數符號表示形式(比如 5e-7
是 0.0000005
指數符號形式)。這就是為什么使用 parseInt()
作用于如此小的浮點數會出現非預期效果:僅解析指數表示形式的重要部分(比如 5e-7
中的 5
)。
挑戰(zhàn):你可以解釋為什么 parseInt(999999999999999999999)
會等于 1
?
到此這篇關于JavaScript中parseInt()的一個怪異行為解決的文章就介紹到這了,更多相關js中parseInt()怪異行為內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
原文鏈接 Solving a Mystery Behavior of parseInt() in JavaScript -- 作者 Dmitri Pavlutin
相關文章
viewer.js一個強大的基于jQuery的圖像查看插件(支持旋轉、縮放)
這篇文章主要介紹了Viewer這一款強大的 jQuery 圖像瀏覽插件,在信息詳情頁面實現點擊圖片可以預覽,腳本之家也是用的這個js,這里為分享一下使用方法,需要的朋友可以參考下2020-04-04js監(jiān)聽鼠標事件控制textarea輸入字符串的個數
一個js控制textarea輸入字符串的個數的腳本,當鼠標按下抬起時判斷輸入字符數,很簡單,但很實用2014-09-09