大家好啸罢,我是IT修真院萌新分院的王寒,一枚正直加勤,純潔仙辟,善良的前端程序員。
今天給大家分享一下基本數(shù)據(jù)類型鳄梅。
1.背景介紹
JavaScript是一種弱類型或者說(shuō)動(dòng)態(tài)語(yǔ)言叠国。就是不用提前聲明變量的類型, 在程序運(yùn)行過(guò)程中戴尸,類型會(huì)被自動(dòng)確定粟焊。這也意味著你可以使用同一個(gè)變量保存不同類型的數(shù)據(jù)
2.知識(shí)剖析
js基本數(shù)據(jù)類型有哪些?
ECMAScript中有5中簡(jiǎn)單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型): Undefined校赤、Null吆玖、Boolean筒溃、Number和String马篮。 還有1中復(fù)雜的數(shù)據(jù)類型————Object,Object本質(zhì)上是由一組無(wú)序的名值對(duì)組成的怜奖。
typeof 操作符
由于js中的變量是松散類型的浑测,所以它提供了一種檢測(cè)當(dāng)前變量的數(shù)據(jù)類型的方法,就是typeof關(guān)鍵字. 通過(guò)typeof關(guān)鍵字歪玲,對(duì)這5種數(shù)據(jù)類型會(huì)返回下面的值(以字符串形式顯示)
undefined ---------- 如果值未定義 Undefined
boolean ---------- 如果這個(gè)值是布爾值 Boolean
string ---------- 如果這個(gè)值是字符串 String
number ---------- 如果這個(gè)值是數(shù)值類型 Number
object ---------- 如果這個(gè)值是對(duì)象或null Object
需要注意的是typeof null返回為object,因?yàn)樘厥庵祅ull被認(rèn)為是一個(gè)空的對(duì)象引用迁央。
1. Undefined
Undefined類型只有一個(gè)值,即特殊的undefined滥崩。在使用var聲明變量但未對(duì)其加以初始化時(shí)岖圈,這個(gè)變量的值就是undefined
var a;
alert(a==undefined);//true
這個(gè)例子只聲明了變量a钙皮,但并沒(méi)有對(duì)它進(jìn)行初始化蜂科。比較這個(gè)變量與undefined字面量,表明它們是相等的
var a=undefined短条;
alert(a==undefined);//true
這個(gè)例子使用undefined值顯示初始化了變量a导匣,但是沒(méi)有必要這么做,因?yàn)槲唇?jīng)初始化的值默認(rèn)就會(huì)取得undefined值
不過(guò)包含undefined值的變量與未定義的變量還是不一樣的
var a=茸时;//這個(gè)變量聲明之后默認(rèn)取得了undefined值
//下面這個(gè)變量并沒(méi)有聲明
//var age
alert(a);? //"undefined"
alert(age);? //產(chǎn)生錯(cuò)誤
第一個(gè)警告框會(huì)顯示a的值贡定,即"undefined";第二個(gè)警告框因?yàn)閭鬟falert()函數(shù)的是沒(méi)有聲明的變量age所以會(huì)出現(xiàn)一個(gè)錯(cuò)誤
對(duì)沒(méi)有初始化的變量執(zhí)行typeof操作符會(huì)返回undefined值可都,而對(duì)沒(méi)有聲明的變量執(zhí)行typeof操作符也會(huì)返回undefined值
var a=缓待;//這個(gè)變量聲明之后默認(rèn)取得了undefined值
//下面這個(gè)變量并沒(méi)有聲明
//var age
alert(typeof a);? //"undefined"
alert(typeof age);? //"undefined"
2.null
Null類型是第二個(gè)只有一個(gè)值的數(shù)據(jù)類型蚓耽,這個(gè)特殊的值是null。從邏輯角度來(lái)看旋炒,null值表示一個(gè)空對(duì)象指針田晚, 而這也正是使用typeof操作符檢測(cè)null時(shí)會(huì)返回object的原因。
var car=null国葬;
alert(typeof car);? //"object"
如果定義的變量準(zhǔn)備在將來(lái)用于保存對(duì)象贤徒,那么最好將該變量初始化為null而不是其他值。這樣一來(lái)汇四, 只要直接檢測(cè)null值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個(gè)對(duì)象的引用了接奈。
if (car !=null){
//對(duì)car對(duì)象執(zhí)行某些操作
}
實(shí)際上undefined值是派生自null值的,因此ECMA-262規(guī)定對(duì)它們的相等性測(cè)試要返回true
alert(null==undefined);//true
位于null和undefined之間的相等操作符"=="總是返回true通孽,不過(guò)需要注意的是這個(gè)操作符醋魚比較的目的會(huì)轉(zhuǎn)換其操作數(shù)
只要意在保存對(duì)象的變量還沒(méi)有真正保存對(duì)象序宦,就應(yīng)該明確的讓該變量保存null值。不僅可以體現(xiàn)null作為空對(duì)象指針的慣例還有助于進(jìn)一步區(qū)分null和undefined
3.Boolean
該類型只有兩個(gè)字面值:true和false背苦。這兩個(gè)值與數(shù)字值不是一回事互捌,因此true不一定等于1,而false也不一定等于0行剂。
var found=true秕噪;
var lost=false彼宠;
需要注意的是Boolean類型的字面值true和false是區(qū)分大小寫的
雖然Boolean類型的字面值只有兩個(gè)早抠,但JavaScript中所有類型的值都有與這兩個(gè)Boolean值等價(jià)的值。 要將一個(gè)值轉(zhuǎn)換為其對(duì)應(yīng)的Boolean值辐怕,可以調(diào)用類型轉(zhuǎn)換函數(shù)Boolean()铲觉,
var message="Hello world"澈蝙;
var messageAsBoolean=Boolean(message);
在這個(gè)例子中撵幽,字符串message被轉(zhuǎn)換成了一個(gè)Boolean值灯荧,該值被保存在messageAsBoolean變量中。 可以對(duì)任何數(shù)據(jù)類型的值調(diào)用Boolean()函數(shù)盐杂,而且總會(huì)返回一個(gè)Boolean值逗载。至于返回的這個(gè)值是true還是false, 取決于要轉(zhuǎn)換值的數(shù)據(jù)類型及其實(shí)際值
數(shù)據(jù)類型轉(zhuǎn)換為true的值轉(zhuǎn)換為false的值
Booleantruefalse
String任何非空字符串..(空字符串)
Number任何非零數(shù)字值(包括無(wú)窮大)0和NaN
Object任何對(duì)象null
Undefined不適用undefined
這些轉(zhuǎn)換規(guī)則對(duì)理解流控制語(yǔ)句(如if語(yǔ)句)自動(dòng)執(zhí)行相應(yīng)的Boolean轉(zhuǎn)換非常重要
var message="Hello world";
if (message){
alert("Value is true");
}
運(yùn)行這個(gè)示例况褪,就會(huì)顯示一個(gè)警告框撕贞,因?yàn)樽址甿essage被自動(dòng)轉(zhuǎn)換成了對(duì)應(yīng)的Boolean值(true)。 由于存在這種自動(dòng)執(zhí)行的Boolean轉(zhuǎn)換测垛,因此確切地知道在流控制語(yǔ)句中使用的是什么變量至關(guān)重要
4.Number
這種類型用來(lái)表示整數(shù)和浮點(diǎn)數(shù)值捏膨,還有一種特殊的數(shù)值,即NaN(非數(shù)值 Not a Number)。 這個(gè)數(shù)值用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會(huì)拋出錯(cuò)誤了)号涯。 例如目胡,在其他編程語(yǔ)言中,任何數(shù)值除以0都會(huì)導(dǎo)致錯(cuò)誤链快,從而停止代碼執(zhí)行誉己。但在JavaScript中, 任何數(shù)值除以0會(huì)返回NaN域蜗,因此不會(huì)影響其他代碼的執(zhí)行巨双。
NaN本身有兩個(gè)非同尋常的特點(diǎn)。首先霉祸,任何涉及NaN的操作(例如NaN/10)都會(huì)返回NaN筑累, 這個(gè)特點(diǎn)在多步計(jì)算中有可能導(dǎo)致問(wèn)題。其次丝蹭,NaN與任何值都不相等慢宗,包括NaN本身。
alert(NaN == NaN);? ? //false
5.String
String類型用于表示由零或多個(gè)16位Unicode字符組成的字符序列奔穿, 即字符串镜沽。字符串可以由單引號(hào)(')或雙引號(hào)(")表示。
String類型的特殊性
string類型有些特殊贱田,因?yàn)樽址哂锌勺兊拇笮∶遘裕燥@然它不能被直接存儲(chǔ)在具有固定大小的變量中。 由于效率的原因湘换,我們希望JS只復(fù)制對(duì)字符串的引用宾舅,而不是字符串的內(nèi)容统阿。但是另一方面彩倚, 字符串在許多方面都和基本類型的表現(xiàn)相似,而字符串是不可變的這一事實(shí)(即沒(méi)法改變一個(gè)字符串值的內(nèi)容)扶平, 因此可以將字符串看成行為與基本類型相似的不可變引用類型
Boolean帆离、Number、String 這三個(gè)是Javascript中的基本包裝類型结澄,也就是這三個(gè)其實(shí)是一個(gè)構(gòu)造函數(shù)哥谷, 他們是Function的實(shí)例,是引用類型麻献,這里的String指的是String這個(gè)構(gòu)造函數(shù),因?yàn)镴avascript是松散類型的们妥。
var name = String("jwy");
alert(typeof name);//"object"
var author = "Tom";
alert(typeof name);//"string"
注意,typeof 變量 如果值是"string" 的話勉吻,也就是這個(gè)變量是字符串监婶,在Javascript中,字符串是基本類型,而在C#或Java中惑惶, 字符串是引用類型煮盼,但是Javascript中的String是引用類型,因?yàn)樗荍avascript中定義好的基本包裝類型带污,在C#中僵控, String跟string其實(shí)是一樣的。
6.Object
ECMAScript中的對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合鱼冀。對(duì)象可以通過(guò)new操作符后跟要?jiǎng)?chuàng)建的對(duì)象類型的名稱來(lái)創(chuàng)建报破。 而創(chuàng)建Object類型的實(shí)例并為其添加屬性和方法,就可以創(chuàng)建自定義對(duì)象
var o=new Object()千绪;
在ECMAScript中Object類型是所有它的實(shí)例的基礎(chǔ)泛烙, 也就是說(shuō)Object類型所具有的任何屬性和方法也同樣存在于更具體的對(duì)象中
3.常見問(wèn)題
問(wèn)題一:如何判斷數(shù)據(jù)類型
問(wèn)題二:常用數(shù)據(jù)轉(zhuǎn)換方法
4.解決方法
一:使用typeof操作符。typeof操作符的操作數(shù)可以是變量也可以是數(shù)值字面量翘紊。需要注意的是 調(diào)用typeof null會(huì)返回"object"蔽氨,因?yàn)閚ull被認(rèn)為是一個(gè)空的對(duì)象引用。
二:轉(zhuǎn)數(shù)值:parseInt() 和 parseFloat()帆疟。
轉(zhuǎn)字符串: .toString()
強(qiáng)制轉(zhuǎn)換:訪問(wèn)數(shù)據(jù)內(nèi)部?jī)?nèi)容鹉究,并將符合格式的內(nèi)容進(jìn)行轉(zhuǎn)換
Boolean(value) - 把給定的值轉(zhuǎn)換成 Boolean 型;
Number(value) - 把給定的值轉(zhuǎn)換成數(shù)字(可以是整數(shù)或浮點(diǎn)數(shù))踪宠;
String(value) - 把給定的值轉(zhuǎn)換成字符串自赔;
5.擴(kuò)展思考
6.參考文獻(xiàn)
7.更多討論
數(shù)組類型屬于哪種類型?
var a=[]柳琢;
alert(typeof a) //Object
問(wèn)題:
1.數(shù)據(jù)類型能不能相互轉(zhuǎn)換
答:可以
2.什么是引用類型
答:引用類型就是對(duì)象
3.引用類型和基本類型的區(qū)別