Number 類型
Number
類型應該是ECMAScript中最令人關注的數(shù)據(jù)類型了,這種類型使用IEEE754格式來表示整數(shù)和浮點數(shù)字(浮點數(shù)字在某些語言中也被稱為雙精度數(shù)值)。為支持各種數(shù)值類型蕾羊,ECMA-262 定義了不同的數(shù)值字面量格式眠饮。
var intNum = 55; //十進制 整數(shù)
八進制字面值第一位必須是(0),然后是(0~7)
var octalNum1= 070; //八進制 56
var octalNum2 = 079; //無效八進制, 解析為79
var octalNum3 = 08; //無效八進制牢贸, 解析為8
八進制在嚴格模式下是無效的饵较,會導致支持該模式的JavaScript引擎拋出錯誤拍嵌。
十六進制字面值前兩位必須是0x,后跟(09循诉,AF/a~f)横辆。
var hexNum1 = 0xA; //十六進制 10
var hexNum2 = 0x1f; //十六進制 31
在進行算術計算時,所有八進制和十六進制表示的數(shù)值最終都將被轉換成十進制數(shù)值茄猫。
-
1.浮點數(shù)值
所謂浮點數(shù)值狈蚤,就是該數(shù)值中必需包含一個小數(shù)點,且小數(shù)點后面必需至少有一位數(shù)字划纽。
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1;
由于保存浮點數(shù)值需要的內(nèi)存空間是保存整數(shù)的兩倍脆侮,因此ECMAScript會不失時機的將浮點數(shù)值轉換為整數(shù)值。如:
var floatNum1 = 1.; //小數(shù)點后面沒有數(shù)字勇劣,解析為1
var floatNum2 = 10.0; //整數(shù)靖避,解析為10
對于那些極大或極小的數(shù)組,可以用e表示法比默。
var floatNum = 3.125e7; //等于31250000
默認情況下幻捏,ECMAScript會將那些小數(shù)點后面帶有6個零以上的浮點數(shù)值轉換為以e表示法表示的數(shù)值。(0.0000003會被轉會成3e-7)
浮點數(shù)值計算會產(chǎn)生舍入誤差問題命咐。
-
2.數(shù)值范圍
ECMAScript能夠表示的最小數(shù)值保存在Number.MIN_VALUE
中——在大多數(shù)瀏覽器中粘咖,這個值是5e-324
;能夠保存最大的數(shù)值保存在Number_MAX_VALUE
中——在大多數(shù)瀏覽器中,這個值是1.7976931348623157e+308
侈百。如果某次計算結果超出JavaScript數(shù)值范圍的值瓮下,那么這個數(shù)將被自動轉換層特殊的(+/-)Infinity
值翰铡。
要想確定一個數(shù)值是不是有窮的(是不是位于最大值和最小值之間),可以使用isFinite()
函數(shù)讽坏。這個函數(shù)在參數(shù)位于最小與最大數(shù)之間是會返回true
,否則返回false
锭魔。
var result = Number.MAX_VALUE + Number.MIN_VALUE;
alert(isFinite(result)); //false
訪問
Number.NEGATIVE_INFINITY
和Number.POSITIVE_INFINITY
也可以得到負和正Infinity
得值÷肺兀可想二見迷捧,這兩個屬性中分別保存這-Infinity
和Infinity
.。
-
3. NaN
NaN
胀葱,即非數(shù)值(Not a Number)是一個特殊的數(shù)值漠秋,這個數(shù)值用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤了)。例如抵屿,在其他編程語言中庆锦,任何數(shù)值除以非數(shù)值都會導致錯誤,從而停止代碼執(zhí)行轧葛。但在ECMAScript中搂抒,任何數(shù)值除以非數(shù)值會返回NaN,因此不會影響其他代碼的執(zhí)行尿扯。
NaN
本身有兩個非同尋常的特點求晶。首先,任何涉及NaN
的操作(例如NaN/10
)都會返回NaN衷笋,這個特定在多步計算中有可能導致問題芳杏。其次,NaN
與任何值都不相等辟宗,包括NaN
本身蚜锨。例如:
alert(NaN === NaN); //false
針對NaN
的這兩個特定,ECMAScript定義了isNaN()
函數(shù)慢蜓。這個函數(shù)接受一個參數(shù),該參數(shù)可以是 任何類型郭膛,而函數(shù)會幫我們確定這個參數(shù)是否“不是數(shù)值”晨抡。isNaN()
在接收到一個值之后,會嘗試將這個值轉換為數(shù)值则剃。某些不是數(shù)值的值會直接轉換為數(shù)值耘柱,例如字符串"10"
或Boolean
值。而任何不能被轉換為數(shù)值的值都會導致這個函數(shù)返回true
棍现。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false
alert(isNaN("10")); //false
alert(isNaN("blue")); //true
alert(isNaN(true)); //false
isNaN()
也適用于對象调煎。在基于對象調用isNaN()
函數(shù)式,會首先調用對象的valueOf()
方法己肮,然后確定該方法放回的值是否可以轉換為數(shù)值士袄。如果不能悲关,則基于這個返回值再調用toString()
方法,再測試返回值娄柳。
-
4. 數(shù)值轉換
有3個函數(shù)可以 把非數(shù)值轉換為數(shù)值:
Number()
parseInt()
parseFloat()
轉型函數(shù)Number()
可以用于任何數(shù)據(jù)類型寓辱,另外兩個函數(shù)則專門用于把字符串轉換成數(shù)值。這3個函數(shù)對于同樣的輸入會有不同的返回結果赤拒。
Number()
函數(shù)的轉換規(guī)則如下:
- 如果是
Boolean
值秫筏,true
和false
將分別被轉換為1和0。
- 如果是數(shù)字值挎挖,只是簡單的傳入和返回这敬。
- 如果是
null
值,返回0蕉朵。 - 如果是
undefined
崔涂,返回NaN
。 - 如果是字符串墓造,遵循下列規(guī)則:
- 如果字符串只包含數(shù)字(包括前面帶正好和負號的情況)堪伍,則將其轉換為十進制數(shù)值,即
"1"
會變成1
觅闽,而"011"
會變成11
(前導零被忽略)帝雇;- 如果字符串中包含有效的浮點格式,如
"1.1"
蛉拙,則將其轉換為對應的浮點數(shù)值(同樣尸闸,也會忽略前導零);- 如果字符串包含有效的十六進制格式孕锄,例如
"0xf"
吮廉,則將其轉換為相同大小的十進制整數(shù)值;- 如果字符串是空的(不包含任何字符)畸肆,則將其轉換為0宦芦;
- 如果字符串中包含除上述格式之外的字符,則將其轉換為
NaN
轴脐。
- 如果是對象调卑,則調用對象的
valueOf()
方法,然后依照前面的規(guī)則轉換返回的值大咱。如果轉換的結果是NaN
恬涧,則調用對象的toString()
方法,然后再一次依照前面的規(guī)則轉換返回的字符串值碴巾。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(" "); //0
var num3 = Number("00000011"); //11
var num4 = Number(true); //1
由于Number()
函數(shù)在轉換字符串時比較復雜而且不夠合理溯捆,因此在處理整數(shù)的時候更常用的是parseInt()
函數(shù)。parseInt()
函數(shù)在轉換字符串時厦瓢,更多的是看其是否符合數(shù)值模式提揍。他會忽略字符串前面的空格啤月,直至找到第一個非空格字符。如果第一個字符不是數(shù)字字符或這負號碳锈,parseInt()
就會返回NaN
顽冶;也就是說,用parseInt()
轉換空字符串會返回NaN
(Number()
對空字符串返回0)售碳。如果第一個字符是數(shù)字字符强重,parseInt()
會繼續(xù)解析,知道解析完所有后續(xù)字符或者遇到了一個非數(shù)字字符贸人。例如"1234blue"
會被轉換為1234
,"22.5"
會被轉換為22
,因為小數(shù)點不是有效的數(shù)字字符间景。
parseInt()
也能夠識別出各種整數(shù)格式(十進制,八進制艺智,十六進制)倘要。
var num1 = parseInt("1234blue"); //1234
var num2 = parseInt(" "); //NaN
var num3 = parseInt("0xA"); //10(十六進制)
var num4 = parseInt("22.5"); //22
var num5 = parseInt("070"); //56(八進制)
var num6 = parseInt("70"); //70(十進制)
var num7 = parseInt("0xf"); //15(十六進制)
ECMAScript 3中的parseInt()
可以解析八進制,但在ECMAScript 5中parseInt()
不具有解析八進制的能力(parseInt(070)//70
)十拣。
為消除在使用parseInt()
函數(shù)時可能導致的困惑封拧,可以為這個函數(shù)提供第二個參數(shù):轉換時使用的基數(shù)(即多少進制)。
var num = parseInt("0xAF",16); //175
var num1 = parseInt("AF",16); //175
var num2 = parseInt("AF"); //NaN
var num1 = parseInt("10",2); //2
var num2 = parseInt("10", 8); //8
var num3 = parseInt("10", 10); //10
var num4 = parseInt("10", 16); //16
parseFloat()
與parseInt()
類似夭问,但只能解析十進制值泽西,如果字符串包含的一個可解析為整數(shù)的數(shù),parseFload()
會返回整數(shù)缰趋。
var num1 = parseFloat("1234blue"); //1234
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000