Javascript提供五種簡(jiǎn)單的數(shù)據(jù)類型,與一種較為復(fù)雜的數(shù)據(jù)類型。
簡(jiǎn)單數(shù)據(jù)類型
-
undefined
- 在使用var聲明變量,但未對(duì)其加以初始化時(shí),這個(gè)變量的類型就是undefined,且其默認(rèn)初始化值為undefined。
- 對(duì)未聲明與初始化的變量,直接使用,那么這個(gè)變量的類型也是undefined,但是沒(méi)有默認(rèn)初始化值。
//undefined
var message;
alert('已經(jīng)聲明但未初始化的變量message的類型是:' +typeof message)
alert('未聲明,也未初始化的變量age的類型是:'+ typeof age)
message
age
【總結(jié)】因?yàn)閖s的變量都是用關(guān)鍵字var
來(lái)聲明的,變量的具體類型取決于他被賦予的變量值,而對(duì)于以上兩種情況,雖然本質(zhì)上有區(qū)別,但是都沒(méi)有被初始化,所以其類型都是undefined。但是后者沒(méi)有初始化值。所以當(dāng)
alert(age);//產(chǎn)生錯(cuò)誤
-
null
- null類型的默認(rèn)值是null,從邏輯角度講,是表示一個(gè)空對(duì)象指針。
- js高級(jí)程序上有講到,undefined類型是派生自null的,不嚴(yán)格的說(shuō)二者都是指沒(méi)有明確賦值的類型,但是細(xì)分之后,undefined類型,被用來(lái)形容未經(jīng)初始化的變量,null類型被用來(lái)形容空對(duì)象指針。
- 所以,如果定義的變量準(zhǔn)備在將來(lái)用于保存對(duì)象(即復(fù)雜的數(shù)據(jù)類型object),那么就該將該變量初始化為null。
-
區(qū)分,當(dāng)一個(gè)變量聲明后,未初始化,則該值為undefined,如果這個(gè)值是為了保存對(duì)象,則修改其默認(rèn)初始化的值,改為null。 所以當(dāng)檢測(cè)其類型時(shí),會(huì)顯示類型為object。
*所以有時(shí)候,當(dāng)問(wèn)到j(luò)s基本數(shù)據(jù)類型時(shí),會(huì)忽略null。
//null
var car=null;
alert('car的類型為:'typeof car)
car=null
-
boolean
- 即布爾類型,該類型有兩個(gè)值:
true
false
- Bloolean()函數(shù),可以將其他類型的值轉(zhuǎn)換為布爾類型。
-
轉(zhuǎn)換規(guī)則
規(guī)則 - 這些轉(zhuǎn)換規(guī)則對(duì)理解流程控制語(yǔ)句,如(if)語(yǔ)句自動(dòng)執(zhí)行相應(yīng)的轉(zhuǎn)換非常重要。
- 即布爾類型,該類型有兩個(gè)值:
-
number
- 該類型的表示方法有兩種形式,第一種是整數(shù),第二種為浮點(diǎn)數(shù)。
- 整數(shù) 可以通過(guò)十進(jìn)制,八進(jìn)制,十六進(jìn)制的字面值來(lái)表示。
var intNum=55;//十進(jìn)制
var octalNum=070;//八進(jìn)制數(shù),第一位必須是0,解析為56
var octalNum=079;//無(wú)效的8進(jìn)制數(shù),9超過(guò)了8進(jìn)制數(shù)的范圍,解析為79
var hexNum=0xA;//十六進(jìn)制數(shù),前兩位必須是0x,后跟16進(jìn)制數(shù)字(09及AF) - 浮點(diǎn)數(shù)
1、該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),且小數(shù)點(diǎn)后必須有一位數(shù)字,如果小數(shù)點(diǎn)后只有零,則該小數(shù)會(huì)被轉(zhuǎn)化為整數(shù)。
2、浮點(diǎn)數(shù)所占據(jù)的內(nèi)存空間是整數(shù)的兩倍。
3、對(duì)極大極小的浮點(diǎn)數(shù)采用e表示法。
var floatNum=3.2e7;//3.2×10(7次冪)
var floatNum=3.2e-7;//3.2×10(-7次冪) - NaN
1、即非數(shù)值,是一個(gè)特殊的值,這個(gè)數(shù)值用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù),未返回?cái)?shù)值的情況。比如任何數(shù)值除以0,本是不符合規(guī)范的,js里,這樣的操作返回NaN(但是實(shí)際上,只有0除以0時(shí)返回NaN,其他則無(wú)窮值)。
2、NaN有兩個(gè)不同尋常的特點(diǎn):任何涉及NaN的操作都會(huì)返回NaN,NaN值與任何值都不相等,包括本身。
3、isNaN()函數(shù),這個(gè)函數(shù)可以判斷,傳遞的參數(shù)是否“不是數(shù)值”這里涉及數(shù)值轉(zhuǎn)換的問(wèn)題,例如“10”這個(gè)字符串就可以轉(zhuǎn)換為10,但是“blue”這個(gè)字符串則無(wú)法轉(zhuǎn)換為數(shù)字,所以isNaN("blue")==true
- 數(shù)值轉(zhuǎn)換
1、有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number(),parseInt(),parseFloat()。第一個(gè)可以用于任何數(shù)據(jù)類型,后兩個(gè),則專門(mén)用于把字符串轉(zhuǎn)化為數(shù)值。
2、這三個(gè)函數(shù)對(duì)于同樣的輸入有不同的效果。
3、數(shù)值轉(zhuǎn)換(另寫(xiě)一篇文章)
-
string
- 字符串類型是最熟悉不過(guò)的啦,至于用單引號(hào),還是雙引號(hào),在js中還是沒(méi)有差別的。記得成對(duì)出現(xiàn)。
var firstName='zakas';
- 字符串類型是最熟悉不過(guò)的啦,至于用單引號(hào),還是雙引號(hào),在js中還是沒(méi)有差別的。記得成對(duì)出現(xiàn)。
- 字符串中一些特殊的字面量,即轉(zhuǎn)義序列。類似于c語(yǔ)言學(xué)過(guò)的那些、
- toString()函數(shù),每個(gè)值都有,但是null與undefined沒(méi)有。一般情況下使用這個(gè)函數(shù)時(shí),沒(méi)有必要傳遞參數(shù),但是調(diào)用數(shù)值的 toString()方法時(shí),可以傳遞基數(shù),默認(rèn)傳遞的是10,代表十進(jìn)制。
- String()函數(shù)可以將任何類型的值轉(zhuǎn)換為字符串,包括null轉(zhuǎn)換為'null'、undefined轉(zhuǎn)換為'undefined'。
復(fù)雜的數(shù)據(jù)類型
-
object
- 該類型實(shí)例化的對(duì)象,是一組數(shù)據(jù)和功能(函數(shù))的集合。
- 實(shí)例化對(duì)象的過(guò)程有兩種,一種是通過(guò)new操作符,一種是通過(guò)對(duì)象字面量表示法。
- object類型是最基本的類型,我們可以在其基礎(chǔ)上繼承出更多的類型,像我們知道的Array()、Date()、還有有意思的function()類型,都是從object繼承的,而且這些類型都在程序員使用前被默認(rèn)設(shè)置了屬性和方法,供程序員調(diào)用。
-
而以上類型又有一個(gè)籠統(tǒng)的稱呼為引用類型。為什么是引用類型呢?
var obj=new Object();
在學(xué)習(xí)C的時(shí)候,知道“ int a; int &ra=a;”,所以ra是a的引用,ra的類型為引用類型,系統(tǒng)并不為引用類型分配內(nèi)存空間。
但是,js所指的引用類型,在《js高級(jí)程序設(shè)計(jì)》這本書(shū)里,也確實(shí)是這樣的概念,obj只是引用類型,是堆內(nèi)存中一個(gè)對(duì)象的別稱,本身并不占用內(nèi)存。
如圖1
但是這本書(shū)里,也說(shuō)對(duì)引用類型的訪問(wèn)是按照引用訪問(wèn),但是當(dāng)
var obj2=obj;
這樣將obj的值復(fù)給obj2時(shí),會(huì)將堆內(nèi)存中object的地址賦給obj2,這句話,又貌似是在說(shuō),在聲明一個(gè)引用類型時(shí),是會(huì)將實(shí)例化對(duì)象地址存到棧內(nèi)存中,然后通過(guò)地址訪問(wèn)堆內(nèi)存。
如圖2
還有一個(gè)難點(diǎn),也是我在學(xué)習(xí)引用類型的時(shí)候困惑的地方,C的時(shí)候,引用是可以做參數(shù)傳遞的,而且,引用不能被賦值,即不能改變引用的值。但是js中,函數(shù)的參數(shù)都是值傳遞的,而對(duì)于js內(nèi)的引用類型,其值,也就默認(rèn)為棧內(nèi)存中的地址。 - 現(xiàn)在,對(duì)于創(chuàng)建對(duì)象的內(nèi)存圖,我查了廣大網(wǎng)友的資料,大家默認(rèn)圖2,希望有對(duì)js引用類型理解更清晰的朋友,可以告訴我一下。謝謝啦!
關(guān)于基本數(shù)據(jù)類型,會(huì)涉及的面試題:
js基本數(shù)據(jù)類型有哪些?
null與undefined的區(qū)別?
應(yīng)該知道答案啦。