Number類型
Number類型應(yīng)該是ECMAScript中最令人關(guān)注的數(shù)據(jù)類型了,這種類型使用IEEE754格式來(lái)表示整數(shù)和浮點(diǎn)數(shù)值(浮點(diǎn)數(shù)值在某些語(yǔ)言中也被稱為雙精度數(shù)值)。為支持各種數(shù)值類型,ECMA-262定義了不同的數(shù)值字面量格式。
最基本的數(shù)值字面量格式是十進(jìn)制整數(shù),十進(jìn)制整數(shù)可以像下面這樣直接在代碼中輸入:
var intNum=55; //整數(shù)
除了以十進(jìn)制表示外,整數(shù)還可以通過(guò)八進(jìn)制(以8為基數(shù))或十六進(jìn)制(以16為基數(shù))的字面值來(lái)表示。其中,八進(jìn)制字面值的第一位必須是零(0),然后是八進(jìn)制數(shù)字序列(0~7)。如果字面值中的數(shù)值超出了范圍,那么前導(dǎo)零將被忽略,后面的數(shù)值將被當(dāng)作十進(jìn)制數(shù)值解析。請(qǐng)看下面的例子:
var octalNuml=070; //八進(jìn)制的56
var octalNum2=079; //無(wú)效的八進(jìn)制數(shù)值——解析為79
var octalNum3=08; ,/無(wú)效的八進(jìn)制數(shù)值——解析為8
十六進(jìn)制字面值的前兩位必須是Ox,后跟任何十六進(jìn)制數(shù)字(O~9及A~F)。其中,字母A~F可以大寫(xiě),也可以小寫(xiě)。如下面的例子所示:
var hexNuml=OxA; //十六進(jìn)制的10
var hexNum2=Oxlf; //十六進(jìn)制的31
南昌網(wǎng)絡(luò)公司百恒網(wǎng)絡(luò)前端開(kāi)發(fā)工程師提醒企業(yè)網(wǎng)站建設(shè)技術(shù)人員,雖然數(shù)值可以用八進(jìn)制或十六進(jìn)制來(lái)表示,但在進(jìn)行算術(shù)計(jì)算時(shí),所有以八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都將被轉(zhuǎn)換成十進(jìn)制數(shù)值。
1.浮點(diǎn)數(shù)值
所謂浮點(diǎn)數(shù)值,就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字。雖然小數(shù)點(diǎn)前面可以沒(méi)有整數(shù),但我們不推薦這種寫(xiě)法。以下是浮點(diǎn)數(shù)值的幾個(gè)例子:
var floatNuml=1.1;
var floatNum2=O.l;
var floatNum3=.1; //有效,但不推薦
南昌網(wǎng)站優(yōu)化公司百恒網(wǎng)絡(luò)前端開(kāi)發(fā)工程師提醒技術(shù)人員由于保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍,因此ECMAScript會(huì)不失時(shí)機(jī)地將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值。顯然,如果小數(shù)點(diǎn)后面沒(méi)有跟任何數(shù)字,那么這個(gè)數(shù)值就可以作為整數(shù)值來(lái)保存。同樣地,如果浮點(diǎn)數(shù)值本身表示的就是一個(gè)整數(shù)(如1.0),那么該值也會(huì)被轉(zhuǎn)換為整數(shù),如下面的例子所示:
var floatNuml=1.; //小數(shù)點(diǎn)后面沒(méi)有數(shù)字——解析為l
var floatNum2=10.0; //整數(shù)——解析為10
對(duì)于那些極大或極小的數(shù)值,可以用e表示法(即科學(xué)計(jì)數(shù)法)表示的浮點(diǎn)數(shù)值表示。用e表示法表示的數(shù)值等于e前面的數(shù)值乘以10的指數(shù)次冪。ECMAScript中e表示法的格式也是如此,即前面是一命數(shù)值(可以是整數(shù)也可以是浮點(diǎn)數(shù)),中間是一個(gè)大寫(xiě)或小寫(xiě)的字母E,后面是10的冪中的指數(shù),該冪值將用來(lái)與前面的數(shù)相乘。下面是一個(gè)使用e表示法表示數(shù)值的例子:
var floatNum=3.125e7; //等于31250000
在這個(gè)例子中,使用e表示法表示的變量floatNum的形式雖然簡(jiǎn)潔,但它的實(shí)際值則是31250000。在此,e表示法的實(shí)際含義就是“3.125乘以l07'’。
也可以使用e表示法表示極小的數(shù)值,如0.00000000000000003,這個(gè)數(shù)值可以使用更簡(jiǎn)潔的3e-17表示。在默認(rèn)情況下,ECMASctipt會(huì)將那些小數(shù)點(diǎn)后面帶有6個(gè)零以上的浮點(diǎn)數(shù)值轉(zhuǎn)換為以e表示法表示的數(shù)值(例如,0.0000003會(huì)被轉(zhuǎn)換成3e-7)。
浮點(diǎn)數(shù)值的最高精度是17位小數(shù),但在進(jìn)行算術(shù)計(jì)算時(shí)其精確度遠(yuǎn)遠(yuǎn)不如整數(shù)。例如,0.1加0.2的結(jié)果不是0.3,而是0.30000000000000004。這個(gè)小小的舍入誤差會(huì)導(dǎo)致無(wú)法測(cè)試特定的浮點(diǎn)數(shù)值。例如:
if(a+b==0.3){//不要做這樣的測(cè)試!
alert("You got 0.3.”);
}
南昌做網(wǎng)站公司百恒網(wǎng)絡(luò)前端開(kāi)發(fā)工程師總結(jié):在這個(gè)例子中,我們測(cè)試的是兩個(gè)數(shù)的和是不是等于0.3。如果達(dá)兩個(gè)數(shù)是0.05和0.25,或者是0.15和0.15都不會(huì)有問(wèn)題。而如前所述,如果這兩個(gè)數(shù)是0.1和0.2,那么測(cè)試將無(wú)法通過(guò)。因此,永遠(yuǎn)不要測(cè)試某個(gè)特定的浮點(diǎn)數(shù)值。
關(guān)于浮點(diǎn)數(shù)值計(jì)算會(huì)產(chǎn)生舍入誤差的問(wèn)題,有一點(diǎn)需要明確:這是使用基于IEEE754數(shù)值的浮點(diǎn)計(jì)算的通病,ECMAScript并非獨(dú)此一家;其他使用相同數(shù)值格式的語(yǔ)言也存在這個(gè)問(wèn)題。
2.數(shù)值范圍
由于內(nèi)存的限制,ECMAScript并不能保存世界上所有的數(shù)值。ECMAScript能夠表示的最小數(shù)值保存在Number.MIN VALUE中——在大多數(shù)瀏覽器中,這個(gè)值是Se-324;能夠表示的最大數(shù)值保存在Number.MAX VALUE中——在大多數(shù)瀏覽器中,這個(gè)值是1.7976931348623157e+308。如果某次計(jì)算的結(jié)果得到了一個(gè)超出JavaScript數(shù)值范圍的值,那么這個(gè)數(shù)值將被自動(dòng)轉(zhuǎn)換成特殊的工nflnity值。
具體來(lái)說(shuō),如果這個(gè)數(shù)值是負(fù)數(shù),則會(huì)被轉(zhuǎn)換成一工nfinity(負(fù)無(wú)窮),如果這個(gè)數(shù)值是正數(shù),則會(huì)被轉(zhuǎn)換成Infinity(正無(wú)窮)。
如上所述,如果某次計(jì)算返回了正或負(fù)的工nfinity值,那么該值將無(wú)法繼續(xù)參與下一次的計(jì)算,因?yàn)楣finity不是能夠參與計(jì)算的數(shù)值。要想確定一個(gè)數(shù)值是不是有窮的(換句話說(shuō),是不是位于 最小和最大的數(shù)值之間),可以使用isFinite()函數(shù)。這個(gè)函數(shù)在參數(shù)位于最小與最大數(shù)值之間時(shí)會(huì)返回true,如下面的例子所示:
var result=Number.MAX_VALUE+Number.MAX_VALUE;
alert (isFinite (result))j //false
盡管在計(jì)算中很少出現(xiàn)某些值超出表示范圍的情況,但在執(zhí)行極小或極大數(shù)值的計(jì)算時(shí),檢測(cè)監(jiān)控這些值是可能的,也是必需的。
3.NaN
NaN,即非數(shù)值(Nota Number)是一個(gè)特殊的數(shù)值,這個(gè)數(shù)值用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會(huì)拋出錯(cuò)誤了)。例如,在其他編程語(yǔ)言中,任何教值除以o都會(huì)導(dǎo)致錯(cuò)誤,從而停止代碼執(zhí)行。但在ECMAScript中,任何數(shù)值除以0會(huì)返回NaN,因此不會(huì)影響其他代碼的執(zhí)行。
NaN本身有兩個(gè)非同尋常的特點(diǎn)。首先,任何涉及NaIV的操作(例如NaN/10)都會(huì)返回NaN,這個(gè)特點(diǎn)在多步計(jì)算中有可能導(dǎo)致問(wèn)題。其次,NaN與任何值都不相等,包括NaN本身。例如,下面的代碼會(huì)返回false:
alert (NaN==NaN)j //false
針對(duì)NaN的這兩個(gè)特點(diǎn),ECMAScript定義了isN型壘函數(shù)。這個(gè)函數(shù)接受一個(gè)參數(shù),該參數(shù)可以是任何類型,而函數(shù)會(huì)幫我們確定這個(gè)參數(shù)是否“不是數(shù)值”。isNaN()在接收到一個(gè)值之后,會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值。某些不是數(shù)值的值會(huì)直接轉(zhuǎn)換為數(shù)值,例如字符串”10。或Boolean值。而任何不能被轉(zhuǎn)換為數(shù)值的值都會(huì)導(dǎo)致這個(gè)函數(shù)返回true。請(qǐng)看下面的例子:
alert (isNaN (NaN))j //true
alert(isNaN(10))j //false(10是一個(gè)數(shù)值)
alert (isNaN(”10”)); //false(可以被轉(zhuǎn)換成數(shù)值10)
ale‘‘(isNaN(”blue”)); //true(不能轉(zhuǎn)換成教值)
alert (isNaN( true)); //false(可以被轉(zhuǎn)換成數(shù)值1)
南昌網(wǎng)站制作公司百恒網(wǎng)絡(luò)前端開(kāi)發(fā)工程師總結(jié),這個(gè)例子測(cè)試了5個(gè)不同的值。測(cè)試的第一個(gè)值是NaN本身,結(jié)果當(dāng)然會(huì)速回t rue。然后分別測(cè)試了數(shù)值10和字符串”10”,結(jié)果這兩個(gè)測(cè)試都返回了false,因?yàn)榍罢弑旧砭褪菙?shù)值,而后者可以被轉(zhuǎn)換成數(shù)值。但是,字符串”blue”不能被轉(zhuǎn)換成數(shù)值,因此函數(shù)返回了true。由于Boolean值 true可以轉(zhuǎn)換成數(shù)值1,因此函數(shù)返回false。
希望對(duì)廣大站長(zhǎng)或網(wǎng)站建設(shè)公司或從事企業(yè)網(wǎng)站建設(shè)的團(tuán)隊(duì)有所幫助,如對(duì)此不太理解的,可以與南昌網(wǎng)絡(luò)公司百恒網(wǎng)絡(luò)技術(shù)部聯(lián)系。我們很高與廣大站長(zhǎng)和網(wǎng)站建設(shè)公司技術(shù)人員分享我們的技術(shù)和經(jīng)驗(yàn)。
專業(yè)專注于南昌網(wǎng)站建設(shè),為用戶提供高品質(zhì)的網(wǎng)絡(luò)產(chǎn)品和優(yōu)質(zhì)的服務(wù)是我們始終追求的目標(biāo)!