JS-基本數(shù)據(jù)類型

Javascript提供五種簡(jiǎn)單的數(shù)據(jù)類型,與一種較為復(fù)雜的數(shù)據(jù)類型。

  • 簡(jiǎn)單數(shù)據(jù)類型

  • undefined

    • 在使用var聲明變量,但未對(duì)其加以初始化時(shí),這個(gè)變量的類型就是undefined,且其默認(rèn)初始化值為undefined。
    • 對(duì)未聲明與初始化的變量,直接使用,那么這個(gè)變量的類型也是undefined,但是沒(méi)有默認(rèn)初始化值。
      //undefined
      var message;
      alert('已經(jīng)聲明但未初始化的變量message的類型是:' +typeof message)
      alert('未聲明,也未初始化的變量age的類型是:'+ typeof age)
      message

      age

      【總結(jié)】因?yàn)閖s的變量都是用關(guān)鍵字var來(lái)聲明的,變量的具體類型取決于他被賦予的變量值,而對(duì)于以上兩種情況,雖然本質(zhì)上有區(qū)別,但是都沒(méi)有被初始化,所以其類型都是undefined。但是后者沒(méi)有初始化值。所以當(dāng)
      alert(age);//產(chǎn)生錯(cuò)誤
  • null

    • null類型的默認(rèn)值是null,從邏輯角度講,是表示一個(gè)空對(duì)象指針。
    • js高級(jí)程序上有講到,undefined類型是派生自null的,不嚴(yán)格的說(shuō)二者都是指沒(méi)有明確賦值的類型,但是細(xì)分之后,undefined類型,被用來(lái)形容未經(jīng)初始化的變量,null類型被用來(lái)形容空對(duì)象指針。
    • 所以,如果定義的變量準(zhǔn)備在將來(lái)用于保存對(duì)象(即復(fù)雜的數(shù)據(jù)類型object),那么就該將該變量初始化為null。
    • 區(qū)分,當(dāng)一個(gè)變量聲明后,未初始化,則該值為undefined,如果這個(gè)值是為了保存對(duì)象,則修改其默認(rèn)初始化的值,改為null。 所以當(dāng)檢測(cè)其類型時(shí),會(huì)顯示類型為object。
      *所以有時(shí)候,當(dāng)問(wèn)到j(luò)s基本數(shù)據(jù)類型時(shí),會(huì)忽略null。
      //null
      var car=null;
      alert('car的類型為:'typeof car)


      car=null
  • boolean

    • 即布爾類型,該類型有兩個(gè)值:true false
    • Bloolean()函數(shù),可以將其他類型的值轉(zhuǎn)換為布爾類型。
    • 轉(zhuǎn)換規(guī)則


      規(guī)則
    • 這些轉(zhuǎn)換規(guī)則對(duì)理解流程控制語(yǔ)句,如(if)語(yǔ)句自動(dòng)執(zhí)行相應(yīng)的轉(zhuǎn)換非常重要。
  • number

    • 該類型的表示方法有兩種形式,第一種是整數(shù),第二種為浮點(diǎn)數(shù)。
    • 整數(shù) 可以通過(guò)十進(jìn)制,八進(jìn)制,十六進(jìn)制的字面值來(lái)表示。
      var intNum=55;//十進(jìn)制
      var octalNum=070;//八進(jìn)制數(shù),第一位必須是0,解析為56
      var octalNum=079;//無(wú)效的8進(jìn)制數(shù),9超過(guò)了8進(jìn)制數(shù)的范圍,解析為79
      var hexNum=0xA;//十六進(jìn)制數(shù),前兩位必須是0x,后跟16進(jìn)制數(shù)字(09及AF)
    • 浮點(diǎn)數(shù)
      1、該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),且小數(shù)點(diǎn)后必須有一位數(shù)字,如果小數(shù)點(diǎn)后只有零,則該小數(shù)會(huì)被轉(zhuǎn)化為整數(shù)。
      2、浮點(diǎn)數(shù)所占據(jù)的內(nèi)存空間是整數(shù)的兩倍。
      3、對(duì)極大極小的浮點(diǎn)數(shù)采用e表示法。
      var floatNum=3.2e7;//3.2×10(7次冪)
      var floatNum=3.2e-7;//3.2×10(-7次冪)
    • NaN
      1、即非數(shù)值,是一個(gè)特殊的值,這個(gè)數(shù)值用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù),未返回?cái)?shù)值的情況。比如任何數(shù)值除以0,本是不符合規(guī)范的,js里,這樣的操作返回NaN(但是實(shí)際上,只有0除以0時(shí)返回NaN,其他則無(wú)窮值)。
      2、NaN有兩個(gè)不同尋常的特點(diǎn):任何涉及NaN的操作都會(huì)返回NaN,NaN值與任何值都不相等,包括本身。
      3、isNaN()函數(shù),這個(gè)函數(shù)可以判斷,傳遞的參數(shù)是否“不是數(shù)值”這里涉及數(shù)值轉(zhuǎn)換的問(wèn)題,例如“10”這個(gè)字符串就可以轉(zhuǎn)換為10,但是“blue”這個(gè)字符串則無(wú)法轉(zhuǎn)換為數(shù)字,所以isNaN("blue")==true
    • 數(shù)值轉(zhuǎn)換
      1、有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number(),parseInt(),parseFloat()。第一個(gè)可以用于任何數(shù)據(jù)類型,后兩個(gè),則專門(mén)用于把字符串轉(zhuǎn)化為數(shù)值。
      2、這三個(gè)函數(shù)對(duì)于同樣的輸入有不同的效果。
      3、數(shù)值轉(zhuǎn)換(另寫(xiě)一篇文章)
  • string

    • 字符串類型是最熟悉不過(guò)的啦,至于用單引號(hào),還是雙引號(hào),在js中還是沒(méi)有差別的。記得成對(duì)出現(xiàn)。
      var firstName='zakas';
      • 字符串中一些特殊的字面量,即轉(zhuǎn)義序列。類似于c語(yǔ)言學(xué)過(guò)的那些、
    • toString()函數(shù),每個(gè)值都有,但是null與undefined沒(méi)有。一般情況下使用這個(gè)函數(shù)時(shí),沒(méi)有必要傳遞參數(shù),但是調(diào)用數(shù)值的 toString()方法時(shí),可以傳遞基數(shù),默認(rèn)傳遞的是10,代表十進(jìn)制。
    • String()函數(shù)可以將任何類型的值轉(zhuǎn)換為字符串,包括null轉(zhuǎn)換為'null'、undefined轉(zhuǎn)換為'undefined'。
  • 復(fù)雜的數(shù)據(jù)類型

  • object

    • 該類型實(shí)例化的對(duì)象,是一組數(shù)據(jù)和功能(函數(shù))的集合。
    • 實(shí)例化對(duì)象的過(guò)程有兩種,一種是通過(guò)new操作符,一種是通過(guò)對(duì)象字面量表示法。
    • object類型是最基本的類型,我們可以在其基礎(chǔ)上繼承出更多的類型,像我們知道的Array()、Date()、還有有意思的function()類型,都是從object繼承的,而且這些類型都在程序員使用前被默認(rèn)設(shè)置了屬性和方法,供程序員調(diào)用。
    • 而以上類型又有一個(gè)籠統(tǒng)的稱呼為引用類型。為什么是引用類型呢?
      var obj=new Object();
      在學(xué)習(xí)C的時(shí)候,知道“ int a; int &ra=a;”,所以ra是a的引用,ra的類型為引用類型,系統(tǒng)并不為引用類型分配內(nèi)存空間。
      但是,js所指的引用類型,在《js高級(jí)程序設(shè)計(jì)》這本書(shū)里,也確實(shí)是這樣的概念,obj只是引用類型,是堆內(nèi)存中一個(gè)對(duì)象的別稱,本身并不占用內(nèi)存。


      如圖1

      但是這本書(shū)里,也說(shuō)對(duì)引用類型的訪問(wèn)是按照引用訪問(wèn),但是當(dāng)
      var obj2=obj;
      這樣將obj的值復(fù)給obj2時(shí),會(huì)將堆內(nèi)存中object的地址賦給obj2,這句話,又貌似是在說(shuō),在聲明一個(gè)引用類型時(shí),是會(huì)將實(shí)例化對(duì)象地址存到棧內(nèi)存中,然后通過(guò)地址訪問(wèn)堆內(nèi)存。


      如圖2

      還有一個(gè)難點(diǎn),也是我在學(xué)習(xí)引用類型的時(shí)候困惑的地方,C的時(shí)候,引用是可以做參數(shù)傳遞的,而且,引用不能被賦值,即不能改變引用的值。但是js中,函數(shù)的參數(shù)都是值傳遞的,而對(duì)于js內(nèi)的引用類型,其值,也就默認(rèn)為棧內(nèi)存中的地址。
    • 現(xiàn)在,對(duì)于創(chuàng)建對(duì)象的內(nèi)存圖,我查了廣大網(wǎng)友的資料,大家默認(rèn)圖2,希望有對(duì)js引用類型理解更清晰的朋友,可以告訴我一下。謝謝啦!

關(guān)于基本數(shù)據(jù)類型,會(huì)涉及的面試題:
js基本數(shù)據(jù)類型有哪些?
null與undefined的區(qū)別?
應(yīng)該知道答案啦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容