ECMAScript中有五種數(shù)據(jù)類(lèi)型(也稱(chēng)為基本數(shù)據(jù)類(lèi)型):Undefined、Null爆班、Boolean衷掷、Number和String。還有一種復(fù)雜數(shù)據(jù)類(lèi)型--Object蛋济,Object本職上是由一組無(wú)須的名值對(duì)組成的棍鳖。
- typeof操作符
使用typeof操作符可能返回下列某個(gè)字符串:
a. "undefined" ——如果之歌值未定義;
b. "boolean" ——如果這個(gè)值是布爾值碗旅;
c. "string" ——如果這個(gè)值是個(gè)字符串渡处;
d. "number" ——如果這個(gè)值是數(shù)值;
e. "object" ——如果這個(gè)值時(shí)對(duì)象或null祟辟;
f. "function" ——如果這個(gè)值時(shí)函數(shù)医瘫; - Undefined類(lèi)型
Undefined類(lèi)型只有一個(gè)值,即特殊的undefined旧困。在聲明變量后并未對(duì)其進(jìn)行初始化(即賦值)時(shí)醇份,這個(gè)變量的值就是undefined。 - Null類(lèi)型
Null類(lèi)型也是一個(gè)只有一個(gè)值的數(shù)據(jù)類(lèi)型吼具,這個(gè)特殊的值時(shí)null僚纷。從邏輯角度講,null值表示一個(gè)空對(duì)象指針拗盒,這也是使用typeof操作符會(huì)返回object的原因怖竭。
如果定義的變量準(zhǔn)備用來(lái)保存對(duì)象,那么最好將該變量初始化為null陡蝇,這樣一來(lái)痊臭,只要檢查null值就可以知道相應(yīng)的變量是否已經(jīng)保存好了一個(gè)對(duì)象的引用。
if (car != null) {
// 對(duì)car對(duì)象執(zhí)行指定操作
}
實(shí)際上登夫,undefined值時(shí)派生自null值的广匙,所以它們的相等性測(cè)試要返回true。
console.log(null == undefined); // true
- Boolean類(lèi)型
Boolean類(lèi)型是ECMAscript中使用的最多的一種類(lèi)型恼策。該類(lèi)型只有兩個(gè)字面值:true和false鸦致。 - Number類(lèi)型
Number類(lèi)型是ECMAScript中最令人關(guān)注的數(shù)據(jù)類(lèi)型,這種類(lèi)型使用IEEE754(一種浮點(diǎn)數(shù)表示標(biāo)準(zhǔn))來(lái)表示整數(shù)和浮點(diǎn)數(shù)值(浮點(diǎn)數(shù)值在某些語(yǔ)言中也被稱(chēng)為雙精度數(shù)值)。其支持幾種不同的數(shù)值字面量格式蹋凝。
最基本的數(shù)值字面量格式是十進(jìn)制整數(shù)
var number = 55;
整數(shù)還可以通過(guò)八進(jìn)制或十六進(jìn)制的字面量來(lái)表示鲁纠。其中,八進(jìn)制字面值的第一位必須是0鳍寂,然后是八進(jìn)制數(shù)字序列(0~7)改含。如果字面值中的數(shù)值超出了范圍,那么前導(dǎo)0將被忽略迄汛,后面的數(shù)值將被當(dāng)做十進(jìn)制數(shù)值解析捍壤。
var number1 = 070; // 0*8^2+7*8^1+0*8^0=56;
var number2 = 079; //無(wú)效的八進(jìn)制數(shù)值——解析為79;
var number3 = 08; //無(wú)效的八進(jìn)制數(shù)值——解析為8;
八進(jìn)制字面量在嚴(yán)格模式下是無(wú)效的,會(huì)導(dǎo)致支持該模式的JavaScript引擎拋出錯(cuò)誤鞍爱。
十六進(jìn)制字面值的前兩位必須是0x鹃觉,后跟任何十六進(jìn)制數(shù)字(09及AF)。其中字母A~F可以大寫(xiě)也可以小寫(xiě)睹逃。
var num1 = 0xA; //十六進(jìn)制的10;
var num2 = 0x1f; //1*16^1+15*16^0=31;
再進(jìn)行算術(shù)計(jì)算時(shí)盗扇,所有以八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都會(huì)被轉(zhuǎn)換成十進(jìn)制數(shù)值。
- 浮點(diǎn)數(shù)值
浮點(diǎn)數(shù)值就是指該數(shù)值中心必須包含一個(gè)小數(shù)點(diǎn)沉填,并且小數(shù)點(diǎn)后必須至少有一個(gè)數(shù)字疗隶。
由于保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍,所以在一些情況下ECMAScript會(huì)將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值翼闹。當(dāng)小數(shù)點(diǎn)后沒(méi)有跟任何數(shù)字斑鼻,那么這個(gè)數(shù)值就可以當(dāng)做整數(shù)值來(lái)保存,同樣地猎荠,如果浮點(diǎn)數(shù)值本身表示的就是一個(gè)整數(shù)坚弱,那么該值也會(huì)被保存為整數(shù)值。
var num1 = 1.; //小數(shù)點(diǎn)后面沒(méi)有數(shù)字——解析為1;
var num2 = 1.0; //整數(shù)——解析為1;
對(duì)于那些極大或極小的數(shù)值关摇,可以用e表示法(即科學(xué)計(jì)數(shù)法)表示的浮點(diǎn)數(shù)值表示荒叶。用e表示法表示的數(shù)值等于e前面的數(shù)值乘以10的指數(shù)次冪。
var num = 3.125e7; //等于31250000;
- 數(shù)值范圍
由于內(nèi)存的限制输虱,ECMAScript并不能保存世界上所有的值停撞。
如果計(jì)算得到一個(gè)超出js數(shù)值范圍的值,那么這個(gè)數(shù)值將自動(dòng)轉(zhuǎn)換為特殊的infinity(正無(wú)窮)值悼瓮。如果是負(fù)數(shù)則轉(zhuǎn)換為-infinity(負(fù)無(wú)窮).
要想確定一個(gè)數(shù)值是否是有窮的,可以使用isFinite()函數(shù)
console.log(isFinite(Number.MAX_VALUE)); //true
- NaN
NaN艰猬,即非數(shù)值(Not a Number)是一個(gè)特殊的數(shù)值横堡,這個(gè)數(shù)值用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會(huì)拋出錯(cuò)誤了)。
NaN有兩個(gè)特點(diǎn)冠桃。首先命贴,任何涉及NaN的操作都會(huì)返回NaN。其次,NaN與任何值都不相等胸蛛,包括NaN本身污茵。
alert(NaN == NaN); // false
針對(duì)NaN的兩個(gè)特點(diǎn),ECMAScript定義了isNaN()函數(shù)葬项。這個(gè)函數(shù)接受一個(gè)參數(shù)泞当,該參數(shù)可以是任何類(lèi)型。在接收到一個(gè)參數(shù)后民珍,會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值襟士。某些不是數(shù)值的值會(huì)直接轉(zhuǎn)換為數(shù)值。而任何不能轉(zhuǎn)換為數(shù)值的值都會(huì)導(dǎo)致這個(gè)函數(shù)返回true
alert(isNaN(NaN)); //true;
alert(isNaN(10)); //false;
alert(isNaN('10')); //false;
alert(isNaN('red)); //true
alert(isNaN(true)); //false