簡單總結(jié)下數(shù)據(jù)類型的轉(zhuǎn)換

在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ù)字類型;在編程語言中被定義了一個特殊的Number數(shù)據(jù)類型-NaN(not a number)用于處理計算中出現(xiàn)錯誤的情況。如它的身世,它的特性也是比較有意思,他自個兒都不等于子個兒!那么我們該如何判斷某個Number的值是否為NaN呢?非常感謝標(biāo)準(zhǔn)給我們提供了一條函數(shù)isNaN(),當(dāng)返回結(jié)果為true是,該Number的值為NaN;當(dāng)然還有一些土辦法,比如:

var nub1 = NaN;
console.log(nub1 == nub1);

拿它與自身做對比,當(dāng)發(fā)現(xiàn)返回結(jié)果為false時(即不相等),那它就是NaN啦。

String:字符串

有零或多個16位Unicode字符組成的字符序列,即字符串;字符串需要有引號包起來,單引號(')或雙引號(")都是合法的,但必須成對出現(xiàn);

Boolean:布爾值

該類型就兩個值true和false;常用于邏輯運(yùn)算。

Undefinded

該類型就一個值,即特殊的undefinded。在使用var聲明變量但為初始化值時,這個變量的值就是undefined。如:

var x;
console.log(x);

返回結(jié)果為undefined;

null

這是第二個只有一個值的數(shù)據(jù)類型。這個特殊的值是null。從邏輯角度來看,null空的對象指針。

Object:對象

ECMAScript中的對象就是一組數(shù)據(jù)和功能的集合。

二:關(guān)于數(shù)據(jù)類型的轉(zhuǎn)換

由于數(shù)據(jù)類型具有動態(tài)性,當(dāng)我們獲取到的數(shù)據(jù),需要進(jìn)行操作而需求的數(shù)據(jù)類型不一致時,我們可以使用數(shù)據(jù)類型轉(zhuǎn)換的方式完成目標(biāo)操作。舉個簡單的例子,當(dāng)我們需要比較“20元”的面額和“50元”的面額哪個比較大的時候?作為一個土生土長的中國人,你可能不需要運(yùn)用數(shù)學(xué)知識,直接通過生活經(jīng)驗(yàn)就能給出答案。但計算機(jī)不行,他沒有生活。他唯一能做的就是通過數(shù)學(xué)運(yùn)算。在他看來就是"20<50",但你的“元”是什么意思,會影響我的判定嗎?為此他可能猶豫不決,甚至直接返回不知道。那么這時候我們就需要通過數(shù)據(jù)類型轉(zhuǎn)換,將“20元”與“50元”映射到同一個集合,只需要計算機(jī)比較它們在這個集合中的數(shù)值大小,那么這個問題就迎刃而解了。當(dāng)然,數(shù)據(jù)類型轉(zhuǎn)換的應(yīng)用場景很多,靈活運(yùn)用對于解決開發(fā)遇到的問題有很大的幫助。
簡單來講,數(shù)據(jù)類型轉(zhuǎn)換有兩種形式;一種是強(qiáng)制類型轉(zhuǎn)換(顯性數(shù)據(jù)轉(zhuǎn)換);做強(qiáng)制類型轉(zhuǎn)換最簡單的方法就是使用Boolean()、Number()、String()、或object()函數(shù);另一種是在對數(shù)據(jù)進(jìn)行一系列操作時,數(shù)據(jù)類型按照某種規(guī)律有系統(tǒng)自動轉(zhuǎn)換,稱之為隱式數(shù)據(jù)類型轉(zhuǎn)換。
為了更直觀了解到數(shù)據(jù)類型,我們可以通過一個操作符typeof(),來查看我們的數(shù)據(jù)類型。便于我們判斷數(shù)據(jù)類型轉(zhuǎn)換的方向。
在這里我們需要做一個小的筆記,typeof()監(jiān)測出的數(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ī)則:
對于數(shù)組或者字符串,從第0位開始,依次查看是否是數(shù)字,如果到某一位不是數(shù)字,就把這位之前的數(shù)字提取出來;如果第0位就不是數(shù)字,直接返回NaN;當(dāng)然,字符串中的小數(shù)點(diǎn)不會被解析,而是直接返回小數(shù)點(diǎn)之前的結(jié)果;
如果要轉(zhuǎn)換的數(shù)據(jù)是以0x開頭,會被解析成十六進(jìn)制;如果這并不是我們想要的,可以使用parseInt的第二個關(guān)于進(jìn)制的參數(shù)來控制解析如:parseInt(s3,10);返回結(jié)果當(dāng)然只會是0;

parseFloat:解析成浮點(diǎn)型

解析規(guī)則和parseInt一樣,不一樣的是,可以解析一個小數(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()的計算;
我們發(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))
才能返回數(shù)字類型

在進(jìn)行數(shù)字轉(zhuǎn)換時,完整把要轉(zhuǎn)換的內(nèi)容看一遍,必須完全符合數(shù)字規(guī)范才去進(jìn)行轉(zhuǎn)換,否則返回NaN;
在對Boolean值進(jìn)行轉(zhuǎn)換時,true是1;false是0;
在對空字符串進(jìn)行轉(zhuǎn)換時,返回的是0;
在對null進(jìn)行轉(zhuǎn)換時,返回0;
在對undefined進(jìn)行轉(zhuǎn)換時,返回NaN;
對數(shù)組進(jìn)行轉(zhuǎn)換,空數(shù)組返回0;當(dāng)數(shù)組的length只有一位時,就去轉(zhuǎn)換這一位,這一位是數(shù)字、字符串或者null才會按照如上規(guī)則進(jìn)行轉(zhuǎn)換,否則返回NaN;當(dāng)數(shù)組的length不止一位時返回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)于對轉(zhuǎn)換內(nèi)容左右兩邊加個“引號”;

Boolean:轉(zhuǎn)換成布爾值;
        true:非0的數(shù)字、非空字符串、函數(shù)、非空對象、數(shù)組(空數(shù)組不是空對象)
        false:0、NaN、空字符串、undefined、null(空對象)

2.隱式類型轉(zhuǎn)換

同樣,我們援引上面的例子,比較20元和五十元面額誰大誰小的情況。按照常規(guī),我們需要先把手動進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換(強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換)之后得到的數(shù)字交由電腦來進(jìn)行比較??刹豢梢宰屗约簛斫鉀Q這個問題呢?
直觀來講,不能~!但某些條件下,它是也是可以按照規(guī)則自動進(jìn)行類型轉(zhuǎn)換的。比如:

==、!=、>、<、>=、<=

當(dāng)我們執(zhí)行邏輯運(yùn)算時:
當(dāng)兩邊都是number,比較number大小
當(dāng)兩邊都是string,比較編碼大小
當(dāng)兩邊都是boolean,比較true與false
當(dāng)一邊number,一邊其他類型,轉(zhuǎn)換成number比較
任意number 與 NaN作比較都返回false ;

===、!==

當(dāng)然,這兩是個例外。它不會去對數(shù)據(jù)類型轉(zhuǎn)換之后再來進(jìn)行邏輯運(yùn)算。而是首先對數(shù)據(jù)類型進(jìn)行判斷,當(dāng)運(yùn)算符兩邊的值類型不同時,直接返回false;在兩邊數(shù)據(jù)類型相同的情況下再比較數(shù)字大小或者編碼大小。

+、++、+=
  1. 如果兩邊都可以轉(zhuǎn)換成數(shù)字,就進(jìn)行數(shù)字相加(number)
  2. 如果不能把左右都轉(zhuǎn)成數(shù)字,就執(zhí)行字符串連接
  3. 如果有一邊為字符串,那就進(jìn)行字符串拼接
  4. 對于轉(zhuǎn)換為數(shù)字類型不為NaN的一條數(shù)據(jù)加上not a number時,返回NaN
  5. string++不等于string+1;返回NaN
  6. ++不能用于字符串鏈接
-、*、/、%、--

會把兩邊都轉(zhuǎn)換成number進(jìn)行相應(yīng)運(yùn)算,只要有一邊不能轉(zhuǎn)換為number就返回NaN;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容