在JavaScript語(yǔ)言中,有7種語(yǔ)言類(lèi)型,他們分別是:
- Undefined
- Null
- Boolean
- Number
- String
- Object
- Symbol(ES6中新加)
下面我們一個(gè)個(gè)來(lái)看:
Undefined
Undefined表示未定義,他的值只有一個(gè),就是undefined。在JavaScript中,任何變量在賦值前都是Undefined類(lèi)型,值為undefined。
根據(jù)他的意義,我們一般不會(huì)把undefined賦給一個(gè)值,從而確保所有undefined的值都處于定義了沒(méi)有賦值的狀態(tài)。
值得注意的是,在JavaScript中,undefined是一個(gè)變量,而不是關(guān)鍵字,所以我們?yōu)榱吮苊鈛ndefined被篡改,我們通常會(huì)使用void 0來(lái)代替undefined。
Null
Null表示定義了但為空,他的值也只有一個(gè)就是null。和undefined不同的是,null是一個(gè)關(guān)鍵字,所以可以放心使用。
Boolean
布爾類(lèi)型有兩個(gè)值,分別為true和false,分別代表真假。
Number
數(shù)字類(lèi)型總共有18437736874454810627(就是:2^64 - 2^53+3)個(gè)。
他有三個(gè)額外的數(shù)值:
- NaN
- Infinity(無(wú)窮大)
- -Infinity(負(fù)無(wú)窮大)
后面兩個(gè)數(shù)值的引入主要是為了不讓除以0出錯(cuò)。(JavaScript中有+0和-0的區(qū)別)
因?yàn)镴avaScript的非整數(shù)是根據(jù)浮點(diǎn)數(shù)定義的,所以非整數(shù)的類(lèi)型無(wú)法用==(===更不行)來(lái)比較,最為著名的就是0.1+0.2 == 0.3這段代碼的輸出為false,我們可以用最小精度值來(lái)進(jìn)行比較:
Math.abs(0.1+0.2-0.3) <= Number.EPSILON
String
字符串,值得注意的是,他有一個(gè)最大長(zhǎng)度的限制:2^53 - 1。
Object
Object表示對(duì)象,他可以被視為一切物體的總稱(chēng)。
甚至于JavaScript中的基本類(lèi)型,在對(duì)象類(lèi)型中我們都可以找到對(duì)應(yīng)的對(duì)象:
- Boolean
- Number
- String
- Symbol
值得注意的是,當(dāng)我們執(zhí)行下面這段代碼true === new Boolean(true),我們會(huì)發(fā)現(xiàn)他返回的結(jié)果是false,等號(hào)的兩邊一個(gè)是布爾類(lèi)型的true,另一邊確是一個(gè)對(duì)象。(Symbol比較特殊,直接new會(huì)報(bào)錯(cuò))
有了上面這個(gè)對(duì)象,我們甚至可以給基本類(lèi)型來(lái)增加一些臨時(shí)的方法。
String.prototype.sayHi = () => console.log('hello world');
'test'.sayHi();
我們可以看到在控制臺(tái)真的打印出來(lái)了hello world。
Symbol
這是一個(gè)ES6新引入的類(lèi)型,他在對(duì)象中存在,但是卻不能用new的方式來(lái)生成一個(gè)新的Symbol,我們可以通過(guò)傳入一個(gè)key來(lái)對(duì)他進(jìn)行賦值,我們可以這樣來(lái)使用他:
let symbol1 = Symbol('test');
值得注意的是,即使我們創(chuàng)建兩個(gè)Symbol('test'),這兩個(gè)symbol也是不相等的。
類(lèi)型轉(zhuǎn)換
作為一門(mén)弱類(lèi)型語(yǔ)言,JavaScript的==運(yùn)算會(huì)實(shí)現(xiàn)跨類(lèi)型的比較,這經(jīng)常會(huì)造成一些判斷的失誤,在我們真實(shí)的工作場(chǎng)景中,經(jīng)常會(huì)要求程序員對(duì)類(lèi)型轉(zhuǎn)換后使用===來(lái)判斷左右兩邊的相等。