文 / ChenMiaochun
JavaScript有7種數(shù)據(jù)類型涂身,其中包括6種基本數(shù)據(jù)類型和1種引用類型(Object)。這篇文章主要講講JavaScript的6種基本數(shù)據(jù)類型和與基本類型相關(guān)的兩種操作符typeof和比較操作符==和===萨咕。6種基本數(shù)據(jù)類型分別為:
? ? 1押袍、Number
? ? 2渡贾、Boolean
? ? 3仙辟、String
? ? 4、Null
? ? 5允懂、Undefined
? ? 6厕怜、Symbol
由于JavaScript(js)的設(shè)計(jì)者當(dāng)初設(shè)計(jì)JavaScript的時(shí)候是參照J(rèn)ava來的,所以js有很多地方與Java相似蕾总,包括這里的基本數(shù)據(jù)類型粥航。
Java的基本數(shù)據(jù)類型有4種,分別為整形生百,浮點(diǎn)型躁锡,布爾型以及字符型。
為什么是這四種呢置侍?其實(shí)想一下就明白了映之,計(jì)算機(jī)剛開始是為了計(jì)算而被發(fā)明的,肯定包括整形和浮點(diǎn)型這兩種關(guān)于計(jì)算的類型蜡坊;另外字符型是因?yàn)橛?jì)算機(jī)不僅僅用作計(jì)算杠输,還可以展現(xiàn)很多信息,信息就是由字符構(gòu)成的秕衙;最后為什么有布爾型蠢甲,其實(shí)這跟我們計(jì)算的過程中的邏輯判斷有關(guān),我們現(xiàn)實(shí)世界也經(jīng)常用到邏輯判斷來交流据忘,比如“如果今天不下雨我就出門玩”鹦牛,這就是邏輯判斷搞糕,計(jì)算機(jī)也一樣,邏輯判斷得到的值就用布爾型來表示曼追。
js也差不多窍仰,用Number代表整形和浮點(diǎn)型,用Boolean代表布爾型礼殊,用String代表字符型和java中的String引用類型驹吮。
另外js還有3種數(shù)據(jù)類型,分別是Null晶伦,Undifined和Symbol碟狞。Symbol在ES6中新定義,符號(hào)類型是唯一的并且不可修改婚陪,這里不細(xì)講族沃。下面分別講講前面五種基本數(shù)據(jù)類型。
Number
js數(shù)字范圍是 -(2的63次方-1) ~ (2的63次方-1) 泌参,字面量除了具體的數(shù)值脆淹,還有三個(gè)特殊的值:+Infinity,-Infinity和NaN及舍。這仨也是number類型未辆,分別當(dāng)計(jì)算為:19 /+0(或19/+0.0窟绷,下同),?19/-0,?0/0時(shí)取得锯玛。與Java不一樣的是,Java是只有浮點(diǎn)型才會(huì)有這仨值+一個(gè)負(fù)零兼蜈,分別是:19.0/0.0,?-19.0/0.0,?0.0/0.0,攘残,負(fù)零是:-19.0/inf。這仨示例如下(其中typeof操作符表示判斷數(shù)據(jù)類型为狸,最后會(huì)細(xì)講):
var a = 19/+0; //或者19/+0.0歼郭,結(jié)果一樣
var b = 19/-0;
var c = 0/0;
document.write(typeof a); //number
document.write(typeof b); //nunmber
document.write(typeof c); //number
document.write(a); //+Infinity(或Infinity)
document.write(b); //-Infinity
document.write(c); //NaN
Boolean
可以有兩個(gè)值:true和false。這個(gè)與Java的一樣辐棒。
String
第一個(gè)字符的下標(biāo)為0病曾,字面量為單引號(hào)或雙引號(hào)括起來的值。
JavaScript 字符串是不可更改的漾根。這意味著字符串一旦被創(chuàng)建泰涂,就不能被修改(因?yàn)槲覀內(nèi)绻鹶ar str = "abcdefg";str = "zzzz";其實(shí)是弄了個(gè)新值給它而不是修改它的值,這點(diǎn)應(yīng)該跟java一樣)辐怕。但是逼蒙,可以基于對(duì)原始字符串的操作來創(chuàng)建新的字符串。
例如:獲取一個(gè)字符串的子串可通過選擇個(gè)別字母或者使用String.substr()寄疏。這個(gè)方法參數(shù)與Java的substring有些不一樣是牢。js的substr(開始index僵井,長度),而Java的substring為(開始Index驳棱,結(jié)束Index(不包括結(jié)束的Index字符))批什,Java這么設(shè)計(jì)是方便計(jì)算截取的子串的長度,這樣長度=endIndex - startIndex蹈胡。但如果只傳入一個(gè)參數(shù)渊季,兩者一樣,都是(開始Index)罚渐。但js也有一個(gè)substring()方法跟Java的完全一樣却汉。
又例如:兩個(gè)字符串的連接使用連接操作符 (+) 或者String.concat()。
Null
Null 類型只有一個(gè)值:null荷并,表示空值合砂,表示沒有被呈現(xiàn)。
Undefined
一個(gè)沒有被賦值的變量會(huì)有個(gè)默認(rèn)值undefined源织。JavaScript的設(shè)計(jì)者希望用null表示一個(gè)空的值翩伪,而undefined表示值未定義。事實(shí)證明谈息,這并沒有什么卵用缘屹,區(qū)分兩者的意義不大。大多數(shù)情況下侠仇,我們都應(yīng)該用null轻姿。undefined僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用。
操作符
這里講講兩種操作符typeof和比較操作符(==和===)逻炊。
typeof
由于JavaScript是松散類型的互亮,因此需要有一種手段來檢測給定變量的數(shù)據(jù)類型——typeof就是負(fù)責(zé)提供這方面信息的操作符。
取值有:'undefined' —— 未定義余素,'boolean' —— 布爾值豹休,'string' —— 字符串,'number' —— 數(shù)字值桨吊,'object' —— 對(duì)象或null威根,function?—— 函數(shù)。舉例如下:
typeof 'some string'; ? ?//string
typeof 95; ? ?//number
typeof null; ? ?//object
==和===
==會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型再比較视乐,有時(shí)會(huì)有比較詭異的結(jié)果洛搀,而===不會(huì)轉(zhuǎn)換數(shù)據(jù)類型,數(shù)據(jù)類型不一致時(shí)直接false炊林,一致再比較姥卢。
如false == 0為true,false===0為false。
另外NaN與自己不相等独榴,不管是NaN==NaN還是NaN===NaN都是false僧叉,這點(diǎn)與java一致。判斷只能通過isNaN(NaN)來棺榔,這與Java的Float.isNaN()和Double.isNaN()一致瓶堕。
最后注意浮點(diǎn)數(shù)的比較,如1 / 3 === (1 - 2 / 3); // false症歇,這不是Js的錯(cuò)郎笆,這是計(jì)算本身的特性決定,所以要判斷是否相等只能通過計(jì)算絕對(duì)值差值忘晤,如:Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true宛蚓。