被寫(xiě)爛了的JS數(shù)據(jù)類(lèi)型

the part that is good is not original, and the part that is original is not good.
--Samual johnson

JS之父曾引用英國(guó)詩(shī)人的這句話來(lái)評(píng)價(jià)其創(chuàng)造的JavaScript語(yǔ)言。信息量挺大,詳見(jiàn)JS誕生時(shí)的歷史

眾所周知,JS有七種數(shù)據(jù)類(lèi)型: number string null undefined object boolean symbol,其中symbol目前不很常用?!皵?shù)據(jù)類(lèi)型有什么好講的,直接用不就是了?”,如果你對(duì)一個(gè)人足夠感興趣,我想你會(huì)去想了解他的前半生的。


數(shù)據(jù)類(lèi)型對(duì)比

由于Brendan創(chuàng)造JS的時(shí)候很大程度上借鑒了Java的數(shù)據(jù)類(lèi)型,所以這里我們來(lái)比較一下兩者的數(shù)據(jù)類(lèi)型??梢悦黠@看出,關(guān)于數(shù)值的各個(gè)類(lèi)型被brendan統(tǒng)一成number,只要是數(shù)值相關(guān)的,那在js中就是number類(lèi)型,不管形式,不管大小(其實(shí)管,后文會(huì)提到)。char在js中對(duì)應(yīng)了string。為紀(jì)念偉大的喬治·布爾先生,brendan沒(méi)有對(duì)boolean進(jìn)行任何改動(dòng)(瞎猜的)。引用類(lèi)型就有趣了,萬(wàn)物歸于object。

為什么JS可以一個(gè)number解決所有的數(shù)值類(lèi)型,或者說(shuō)一個(gè)變量就可以任意類(lèi)型的數(shù)據(jù)。答案在你開(kāi)始學(xué)習(xí)JavaScript的那幾段話中,“JavaScript是一種動(dòng)態(tài)類(lèi)型、弱類(lèi)型...的語(yǔ)言”。動(dòng)態(tài)類(lèi)型意味著在聲明一個(gè)變量之后,可以存儲(chǔ)不同類(lèi)型的變量。也就是說(shuō)在JS中聲明一個(gè)變量a,他的初始值是13,var a= 13, 在這語(yǔ)句之后,你仍然可以再寫(xiě)一個(gè)這樣的語(yǔ)句a = '13.333'來(lái)改變a的值且不會(huì)報(bào)錯(cuò),甚至可以寫(xiě)?a = 'name is sam'。

不扒歷史鉆字眼了,探索和收斂的度需要控制好。下面逐一介紹每個(gè)數(shù)據(jù)類(lèi)型。

number

JavaScript內(nèi)部,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式存儲(chǔ),整數(shù)也是。
JavaScript能夠表示的數(shù)值范圍是2^-1023到2^1024,超出的范圍的數(shù)無(wú)法表示。
溢出能夠表示的范圍會(huì)返回Infinity(正數(shù))或者0(負(fù)數(shù))。
數(shù)值可以有多種表示方法,字面形式和科學(xué)計(jì)數(shù)法。
字面形式:35 ? ? ? ?0xFF(十六進(jìn)制) ? ? 123e。
除以下情況外都采用字面形式表示,小數(shù)點(diǎn)前數(shù)字多于21位或后的零多于5個(gè)。
有四種進(jìn)制來(lái)表示字面量:十進(jìn)制 十六進(jìn)制 八進(jìn)制 二進(jìn)制。
屬于number類(lèi)型的特殊數(shù)值:-0 +0 NaN 正負(fù)Infinity。
NaN參與的絕大部分運(yùn)算都會(huì)得到諸如NaN false 這樣的答案。
數(shù)值相關(guān)的全局方法 parseInt() parseFloat() isNaN() isFinite()

string

字符串默認(rèn)只能寫(xiě)在一行內(nèi),分成多行將會(huì)報(bào)錯(cuò),如果必須,要在每一行的結(jié)尾使用反斜桿,但反斜桿后不能有諸如空格的其他字符。
連接運(yùn)算符 + 可以連接多個(gè)單行字符串,將長(zhǎng)字符串拆成多行書(shū)寫(xiě)。
length屬性返回字符串長(zhǎng)度。
由于歷史原因,JavaScript使用Unicode字符集。
btoa()將任意值專(zhuān)為Base64編碼,atob()將base64編碼專(zhuān)為原來(lái)的值。

null & undefined

都表示沒(méi)有,在真值判斷中都是false,null == undefined。
二者的來(lái)由很有歷史原因,最開(kāi)始null用于標(biāo)識(shí)對(duì)象為空,這也是現(xiàn)在tyepof null //object?的原因,之后又添加了一個(gè)undefined類(lèi)型。
二者的區(qū)別,null是一個(gè)表示‘空’的對(duì)象,專(zhuān)為數(shù)值時(shí)為0,undefined 是一個(gè)表示此處無(wú)定義的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN。

Boolean

除了以下值: undefined null false 0 NaN "" 或者' '其他值都視為true。
空數(shù)組和空對(duì)象都是true。

object

注意,開(kāi)頭是小寫(xiě)的o。
對(duì)象是一組鍵值對(duì)的集合(key-value),是一種無(wú)序的符合數(shù)據(jù)集合。
對(duì)象里的value可以是各種類(lèi)型的數(shù)據(jù),對(duì)象里可以嵌套對(duì)象。
key都是字符串,可加可不加引號(hào)。
存放于對(duì)象中的函數(shù)稱(chēng)為方法。
對(duì)象屬性的讀取和賦值 objec.property || object['property']。
可通過(guò)(Object.keys(obj)).length?獲得對(duì)象key的長(zhǎng)度。
使用delete命令刪除對(duì)象屬性值?delete obj.p。
使用in運(yùn)算符檢查對(duì)象中是否有某個(gè)屬性?'p' in obj。
使用for in 循環(huán)遍歷對(duì)象屬性,會(huì)跳過(guò)不可遍歷屬性,且遍歷繼承的屬性。

學(xué)到的東西不夠多,就無(wú)法把這些點(diǎn)恰如其分的串聯(lián)起來(lái)。:(

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

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

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