在ECMAScript中,規(guī)定有5種簡單的數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型)即:Number、String、Boolean、Undefinded和Null;還有一種復(fù)雜數(shù)據(jù)類型:Object;
一:關(guān)于數(shù)據(jù)類型
Number:數(shù)字
從 正無窮 到 負(fù)無窮 包含整數(shù)和浮點(diǎn)數(shù),這涵蓋我們?nèi)粘I钪姓J(rèn)知的數(shù)字類型;在編程語言中被定義了一個(gè)特殊的Number數(shù)據(jù)類型-NaN(not a number)用于處理計(jì)算中出現(xiàn)錯(cuò)誤的情況。如它的身世,它的特性也是比較有意思,他自個(gè)兒都不等于子個(gè)兒!那么我們?cè)撊绾闻袛嗄硞€(gè)Number的值是否為NaN呢?非常感謝標(biāo)準(zhǔn)給我們提供了一條函數(shù)isNaN(),當(dāng)返回結(jié)果為true是,該Number的值為NaN;當(dāng)然還有一些土辦法,比如:
var nub1 = NaN;
console.log(nub1 == nub1);
拿它與自身做對(duì)比,當(dāng)發(fā)現(xiàn)返回結(jié)果為false時(shí)(即不相等),那它就是NaN啦。
String:字符串
有零或多個(gè)16位Unicode字符組成的字符序列,即字符串;字符串需要有引號(hào)包起來,單引號(hào)(')或雙引號(hào)(")都是合法的,但必須成對(duì)出現(xiàn);
Boolean:布爾值
該類型就兩個(gè)值true和false;常用于邏輯運(yùn)算。
Undefinded
該類型就一個(gè)值,即特殊的undefinded。在使用var聲明變量但為初始化值時(shí),這個(gè)變量的值就是undefined。如:
var x;
console.log(x);
返回結(jié)果為undefined;
null
這是第二個(gè)只有一個(gè)值的數(shù)據(jù)類型。這個(gè)特殊的值是null。從邏輯角度來看,null空的對(duì)象指針。
Object:對(duì)象
ECMAScript中的對(duì)象就是一組數(shù)據(jù)和功能的集合。
二:關(guān)于數(shù)據(jù)類型的轉(zhuǎn)換
由于數(shù)據(jù)類型具有動(dòng)態(tài)性,當(dāng)我們獲取到的數(shù)據(jù),需要進(jìn)行操作而需求的數(shù)據(jù)類型不一致時(shí),我們可以使用數(shù)據(jù)類型轉(zhuǎn)換的方式完成目標(biāo)操作。舉個(gè)簡單的例子,當(dāng)我們需要比較“20元”的面額和“50元”的面額哪個(gè)比較大的時(shí)候?作為一個(gè)土生土長的中國人,你可能不需要運(yùn)用數(shù)學(xué)知識(shí),直接通過生活經(jīng)驗(yàn)就能給出答案。但計(jì)算機(jī)不行,他沒有生活。他唯一能做的就是通過數(shù)學(xué)運(yùn)算。在他看來就是"20<50",但你的“元”是什么意思,會(huì)影響我的判定嗎?為此他可能猶豫不決,甚至直接返回不知道。那么這時(shí)候我們就需要通過數(shù)據(jù)類型轉(zhuǎn)換,將“20元”與“50元”映射到同一個(gè)集合,只需要計(jì)算機(jī)比較它們?cè)谶@個(gè)集合中的數(shù)值大小,那么這個(gè)問題就迎刃而解了。當(dāng)然,數(shù)據(jù)類型轉(zhuǎn)換的應(yīng)用場景很多,靈活運(yùn)用對(duì)于解決開發(fā)遇到的問題有很大的幫助。
簡單來講,數(shù)據(jù)類型轉(zhuǎn)換有兩種形式;一種是強(qiáng)制類型轉(zhuǎn)換(顯性數(shù)據(jù)轉(zhuǎn)換);做強(qiáng)制類型轉(zhuǎn)換最簡單的方法就是使用Boolean()、Number()、String()、或object()函數(shù);另一種是在對(duì)數(shù)據(jù)進(jìn)行一系列操作時(shí),數(shù)據(jù)類型按照某種規(guī)律有系統(tǒng)自動(dòng)轉(zhuǎn)換,稱之為隱式數(shù)據(jù)類型轉(zhuǎn)換。
為了更直觀了解到數(shù)據(jù)類型,我們可以通過一個(gè)操作符typeof(),來查看我們的數(shù)據(jù)類型。便于我們判斷數(shù)據(jù)類型轉(zhuǎn)換的方向。
在這里我們需要做一個(gè)小的筆記,typeof()監(jiān)測(cè)出的數(shù)據(jù)類型,和ECMAScript的劃分有一些小小的差異,在typeof()的結(jié)果中,數(shù)據(jù)類型劃分為:Number、String、Boolean、Function、Undefinded和Object ;
1.強(qiáng)制類型轉(zhuǎn)換
parseInt:解析成整型;
(function () {
var s1 = '123';
var s2 = 'a123';
var s3 = '0x123';
var s4 = '123.5';
var n1 = 123;
var n2 = 123.9;
var b1 = true;
var b2 = false;
var fn = function(){};
var obj = {"n":1};
var arr1 = [];
var arr2 = ['0.13'];
console.log(parseInt(s1))
console.log(parseInt(s2))
console.log(parseInt(s3))
console.log(parseInt(s4))
console.log(parseInt(b1))
console.log(parseInt(b2))
console.log(parseInt(fn))
console.log(parseInt(obj))
console.log(parseInt(arr1))
console.log(parseInt(arr2))
console.log(parseInt(n2))
})()
從上面的例子中,我們可以 查看到返回結(jié)果依次為:
123、NaN、291、123、NaN、NaN、NaN、NaN、NaN、0、123
可以看到返回結(jié)果非NaN的就parseInt(s1)、parseInt(s3)、parseInt(s4)、parseInt(arr2)、console.log(parseInt(n2))
也就是說,除本身就是數(shù)字外,只有某些字符串或者數(shù)組才能通過parseInt()來進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換;
那么簡單總結(jié)下parseInt()的數(shù)據(jù)轉(zhuǎn)換規(guī)則:
對(duì)于數(shù)組或者字符串,從第0位開始,依次查看是否是數(shù)字,如果到某一位不是數(shù)字,就把這位之前的數(shù)字提取出來;如果第0位就不是數(shù)字,直接返回NaN;當(dāng)然,字符串中的小數(shù)點(diǎn)不會(huì)被解析,而是直接返回小數(shù)點(diǎn)之前的結(jié)果;
如果要轉(zhuǎn)換的數(shù)據(jù)是以0x開頭,會(huì)被解析成十六進(jìn)制;如果這并不是我們想要的,可以使用parseInt的第二個(gè)關(guān)于進(jìn)制的參數(shù)來控制解析如:parseInt(s3,10);返回結(jié)果當(dāng)然只會(huì)是0;
parseFloat:解析成浮點(diǎn)型
解析規(guī)則和parseInt一樣,不一樣的是,可以解析一個(gè)小數(shù)點(diǎn)。
比如,按照上面的數(shù)據(jù)我們?nèi)。?
console.log(parseFloat(s1))
console.log(parseFloat(s3,10))
console.log(parseFloat(s4))
console.log(parseFloat(arr2))
返回的結(jié)果依次為:
123、0、123.5、0.13
Number:解析成數(shù)字;
按照以上的數(shù)據(jù),依次進(jìn)行轉(zhuǎn)換成數(shù)字類型Number()的計(jì)算;
我們發(fā)現(xiàn)只有:
console.log(Number(s1))
console.log(Number(s2))
console.log(Number(s3))
console.log(Number(s4))
console.log(Number(n2))
console.log(Number(b1))
console.log(Number(b2))
才能返回?cái)?shù)字類型
在進(jìn)行數(shù)字轉(zhuǎn)換時(shí),完整把要轉(zhuǎn)換的內(nèi)容看一遍,必須完全符合數(shù)字規(guī)范才去進(jìn)行轉(zhuǎn)換,否則返回NaN;
在對(duì)Boolean值進(jìn)行轉(zhuǎn)換時(shí),true是1;false是0;
在對(duì)空字符串進(jìn)行轉(zhuǎn)換時(shí),返回的是0;
在對(duì)null進(jìn)行轉(zhuǎn)換時(shí),返回0;
在對(duì)undefined進(jìn)行轉(zhuǎn)換時(shí),返回NaN;
對(duì)數(shù)組進(jìn)行轉(zhuǎn)換,空數(shù)組返回0;當(dāng)數(shù)組的length只有一位時(shí),就去轉(zhuǎn)換這一位,這一位是數(shù)字、字符串或者null才會(huì)按照如上規(guī)則進(jìn)行轉(zhuǎn)換,否則返回NaN;當(dāng)數(shù)組的length不止一位時(shí)返回NaN;
String:轉(zhuǎn)換成字符串
console.log(String(n1))
console.log(String(n2))
console.log(String(b1))
console.log(String(n2))
console.log(String(b2))
console.log(String(fn))
console.log(String(obj))
console.log(String(arr1))
console.log(String(arr2))
相當(dāng)于對(duì)轉(zhuǎn)換內(nèi)容左右兩邊加個(gè)“引號(hào)”;
Boolean:轉(zhuǎn)換成布爾值;
true:非0的數(shù)字、非空字符串、函數(shù)、非空對(duì)象、數(shù)組(空數(shù)組不是空對(duì)象)
false:0、NaN、空字符串、undefined、null(空對(duì)象)
2.隱式類型轉(zhuǎn)換
同樣,我們?cè)厦娴睦?,比較20元和五十元面額誰大誰小的情況。按照常規(guī),我們需要先把手動(dòng)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換(強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換)之后得到的數(shù)字交由電腦來進(jìn)行比較??刹豢梢宰屗约簛斫鉀Q這個(gè)問題呢?
直觀來講,不能~!但某些條件下,它是也是可以按照規(guī)則自動(dòng)進(jìn)行類型轉(zhuǎn)換的。比如:
==、!=、>、<、>=、<=
當(dāng)我們執(zhí)行邏輯運(yùn)算時(shí):
當(dāng)兩邊都是number,比較number大小
當(dāng)兩邊都是string,比較編碼大小
當(dāng)兩邊都是boolean,比較true與false
當(dāng)一邊number,一邊其他類型,轉(zhuǎn)換成number比較
任意number 與 NaN作比較都返回false ;
===、!==
當(dāng)然,這兩是個(gè)例外。它不會(huì)去對(duì)數(shù)據(jù)類型轉(zhuǎn)換之后再來進(jìn)行邏輯運(yùn)算。而是首先對(duì)數(shù)據(jù)類型進(jìn)行判斷,當(dāng)運(yùn)算符兩邊的值類型不同時(shí),直接返回false;在兩邊數(shù)據(jù)類型相同的情況下再比較數(shù)字大小或者編碼大小。
+、++、+=
- 如果兩邊都可以轉(zhuǎn)換成數(shù)字,就進(jìn)行數(shù)字相加(number)
- 如果不能把左右都轉(zhuǎn)成數(shù)字,就執(zhí)行字符串連接
- 如果有一邊為字符串,那就進(jìn)行字符串拼接
- 對(duì)于轉(zhuǎn)換為數(shù)字類型不為NaN的一條數(shù)據(jù)加上not a number時(shí),返回NaN
- string++不等于string+1;返回NaN
- ++不能用于字符串鏈接
-、*、/、%、--
會(huì)把兩邊都轉(zhuǎn)換成number進(jìn)行相應(yīng)運(yùn)算,只要有一邊不能轉(zhuǎn)換為number就返回NaN;