3.4.5 Number 類型
Number 類型使用 IEEE 754格式表示整數(shù)和浮點(diǎn)值(在某些語言中也叫雙精度值)。不同的數(shù)值類型相應(yīng)地也有不同的數(shù)值字面量格式。
最基本的數(shù)值字面量格式是十進(jìn)制整數(shù),直接寫出來即可。
整數(shù)也可以用八進(jìn)制(以 8 為基數(shù))或十六進(jìn)制(以 16 為基數(shù))字面量表示。
對于八進(jìn)制字面量,第一個數(shù)字必須是零(0),然后是相應(yīng)的八進(jìn)制數(shù)字(數(shù)值 0~7)。如果字面量中包含的數(shù)字超出了應(yīng)有的范圍,就會忽略前綴的零,后面的數(shù)字序列會被當(dāng)成十進(jìn)制數(shù)。
八進(jìn)制字面量在嚴(yán)格模式下是無效的,會導(dǎo)致 JavaScript 引擎拋出語法錯誤。
-
- 浮點(diǎn)值
- 要定義浮點(diǎn)值,數(shù)值中必須包含小數(shù)點(diǎn),而且小數(shù)點(diǎn)后面必須至少有一個數(shù)字。
- 因?yàn)榇鎯Ω↑c(diǎn)值使用的內(nèi)存空間是存儲整數(shù)值的兩倍,所以 ECMAScript 總是想方設(shè)法把值轉(zhuǎn)換為整數(shù)。在小數(shù)點(diǎn)后面沒有數(shù)字的情況下,數(shù)值就會變成整數(shù)。
- 對于非常大或非常小的數(shù)值,浮點(diǎn)值可以用科學(xué)記數(shù)法來表示。科學(xué)記數(shù)法用于表示一個應(yīng)該乘以10 的給定次冪的數(shù)值。
- 值的范圍
- 由于內(nèi)存的限制,ECMAScript 并不支持表示這個世界上的所有數(shù)值。ECMAScript 可以表示的最小數(shù)值保存在 Number.MIN_VALUE 中,這個值在多數(shù)瀏覽器中是 5e?324;可以表示的最大數(shù)值保存在Number.MAX_VALUE 中,這個值在多數(shù)瀏覽器中是 1.797 693 134 862 315 7e+308。如果某個計(jì)算得到的數(shù)值結(jié)果超出了 JavaScript 可以表示的范圍,那么這個數(shù)值會被自動轉(zhuǎn)換為一個特殊的 Infinity (無窮)值。任何無法表示的負(fù)數(shù)以 -Infinity (負(fù)無窮大)表示,任何無法表示的正數(shù)以 Infinity (正無窮大)表示。
- NaN
- 有一個特殊的數(shù)值叫 NaN ,意思是“不是數(shù)值”(Not a Number),用于表示本來要返回?cái)?shù)值的操作失敗了(而不是拋出錯誤)。比如,用 0 除任意數(shù)值在其他語言中通常都會導(dǎo)致錯誤,從而中止代碼執(zhí)行。但在 ECMAScript 中,0、+0 或?0 相除會返回 NaN。
- 如果分子是非 0 值,分母是有符號 0 或無符號 0,則會返回 Infinity 或 -Infinity。
- NaN 有幾個獨(dú)特的屬性:
- 任何涉及 NaN 的操作始終返回 NaN (如 NaN/10 )
- NaN 不等于包括 NaN 在內(nèi)的任何值
- ECMAScript 提供了 isNaN() 函數(shù)。該函數(shù)接收一個參數(shù),可以是任意數(shù)據(jù)類型,然后判斷這個參數(shù)是否“不是數(shù)值”。
- 數(shù)值轉(zhuǎn)換
- 有 3 個函數(shù)可以將非數(shù)值轉(zhuǎn)換為數(shù)值:
- Number()
- Number() 函數(shù)基于如下規(guī)則執(zhí)行轉(zhuǎn)換:
- 布爾值, true 轉(zhuǎn)換為 1, false 轉(zhuǎn)換為 0。
- 數(shù)值,直接返回。
- null ,返回 0。
- undefined ,返回 NaN 。
- 字符串,應(yīng)用以下規(guī)則:
- 如果字符串包含數(shù)值字符,包括數(shù)值字符前面帶加、減號的情況,則轉(zhuǎn)換為一個十進(jìn)制數(shù)值。因此, Number("1") 返回 1, Number("123") 返回 123,Number("011") 返回 11(忽略前面的零)。
- 如果字符串包含有效的浮點(diǎn)值格式如 "1.1" ,則會轉(zhuǎn)換為相應(yīng)的浮點(diǎn)值(同樣,忽略前面的零)。
- 如果字符串包含有效的十六進(jìn)制格式如 "0xf" ,則會轉(zhuǎn)換為與該十六進(jìn)制值對應(yīng)的十進(jìn)制整數(shù)值。
- 如果是空字符串(不包含字符),則返回 0。
- 如果字符串包含除上述情況之外的其他字符,則返回 NaN 。
- 對象,調(diào)用 valueOf() 方法,并按照上述規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換結(jié)果是 NaN ,則調(diào)用toString() 方法,再按照轉(zhuǎn)換字符串的規(guī)則轉(zhuǎn)換。
- Number() 函數(shù)基于如下規(guī)則執(zhí)行轉(zhuǎn)換:
- parseInt()
- parseInt() 函數(shù)更專注于字符串是否包含數(shù)值模式。字符串最前面的空格會被
忽略,從第一個非空格字符開始轉(zhuǎn)換。如果第一個字符不是數(shù)值字符、加號或減號, parseInt() 立即返回 NaN 。這意味著空字符串也會返回 NaN (這一點(diǎn)跟 Number() 不一樣,它返回 0)。如果第一個字符是數(shù)值字符、加號或減號,則繼續(xù)依次檢測每個字符,直到字符串末尾,或碰到非數(shù)值字符。比如,"1234blue" 會被轉(zhuǎn)換為 1234,因?yàn)?"blue" 會被完全忽略。類似地, "22.5" 會被轉(zhuǎn)換為 22,因?yàn)樾?shù)點(diǎn)不是有效的整數(shù)字符。 - 假設(shè)字符串中的第一個字符是數(shù)值字符, parseInt() 函數(shù)也能識別不同的整數(shù)格式(十進(jìn)制、八進(jìn)制、十六進(jìn)制)。換句話說,如果字符串以 "0x" 開頭,就會被解釋為十六進(jìn)制整數(shù)。如果字符串以 "0"開頭,且緊跟著數(shù)值字符,在非嚴(yán)格模式下會被某些實(shí)現(xiàn)解釋為八進(jìn)制整數(shù)。
- 不同的數(shù)值格式很容易混淆,因此 parseInt() 也接收第二個參數(shù),用于指定底數(shù)(進(jìn)制數(shù))。
- parseInt() 函數(shù)更專注于字符串是否包含數(shù)值模式。字符串最前面的空格會被
- parseFloat()
- parseFloat() 函數(shù)的工作方式跟 parseInt() 函數(shù)類似,都是從位置 0 開始檢測每個字符。同樣,它也是解析到字符串末尾或者解析到一個無效的浮點(diǎn)數(shù)值字符為止。這意味著第一次出現(xiàn)的小數(shù)點(diǎn)是有效的,但第二次出現(xiàn)的小數(shù)點(diǎn)就無效了,此時字符串的剩余字符都會被忽略。因此, "22.34.5" 將轉(zhuǎn)換成 22.34。
- parseFloat() 函數(shù)的另一個不同之處在于,它始終忽略字符串開頭的零。這個函數(shù)能識別前面討論的所有浮點(diǎn)格式,以及十進(jìn)制格式(開頭的零始終被忽略)。十六進(jìn)制數(shù)值始終會返回 0。因?yàn)?strong>parseFloat() 只解析十進(jìn)制值,因此不能指定底數(shù)。最后,如果字符串表示整數(shù)(沒有小數(shù)點(diǎn)或者小數(shù)點(diǎn)后面只有一個零),則 parseFloat() 返回整數(shù)。
- Number()
- 有 3 個函數(shù)可以將非數(shù)值轉(zhuǎn)換為數(shù)值:
- 浮點(diǎn)值