JavaScript語(yǔ)言中值的類型

1. 基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型

JavaScript中的變量是沒(méi)有類型的,只有值才有,變量可以隨時(shí)持有任何類型的值谢揪。JavaScript中值的類型分為基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型。JavaScript中有5種基礎(chǔ)數(shù)據(jù)類型,分別是:

  1. Null(空值)
  2. Undefined(未定義:已聲明谢澈,未賦值)
  3. Boolean(布爾值)
  4. Number(數(shù)字)
  5. String(字符串)

ES6中新增了Symbol數(shù)據(jù)類型,Symbol是類字符串形式的基礎(chǔ)數(shù)據(jù)類型御板,暫不考慮锥忿。基礎(chǔ)數(shù)據(jù)類型都是按值訪問(wèn)怠肋,因?yàn)槲覀兛梢灾苯硬僮鞅4嬖谧兞恐械膶?shí)際的值敬鬓。JavaScript還有一種復(fù)雜數(shù)據(jù)類型:Object(對(duì)象類型)。引用數(shù)據(jù)類型就是由多個(gè)值組成的對(duì)象,所有引用類型的值都是Object的實(shí)例钉答。包括:

  1. Object(對(duì)象)
  2. Array(數(shù)組)
  3. Date(日期)
  4. ReqExp(正則表達(dá)式)
  5. Function(函數(shù))
  6. 基本包裝類型(3個(gè)特殊的引用類型:Boolean础芍、Number和String,為其對(duì)應(yīng)的基礎(chǔ)數(shù)據(jù)類型提供方法)

引用數(shù)據(jù)類型的值是保存在堆內(nèi)存中的對(duì)象数尿。JavaScript不允許直接訪問(wèn)堆內(nèi)存中的位置,因此我們不能直接操作對(duì)象的堆內(nèi)存空間右蹦。在操作對(duì)象時(shí)刽辙,實(shí)際上是在操作對(duì)象的引用而不是實(shí)際的對(duì)象。因此甲献,引用類型的值都是按引用訪問(wèn)的宰缤。這里的引用,我們可以理解為保存在變量對(duì)象中的一個(gè)地址晃洒,該地址與堆內(nèi)存的實(shí)際值相關(guān)聯(lián)慨灭。

2. 類型檢測(cè)

2.1 typeof 操作符

typeof 是一個(gè)操作符而不是函數(shù)(因此其操作數(shù)可以加括號(hào)也可以不加括號(hào)),用于檢測(cè)給定變量或字面量的數(shù)據(jù)類型球及,其返回值為代表類型的字符串氧骤,可能值為:

  1. "undefined" —— 這個(gè)值已聲明但未賦值
  2. "boolean" —— 這個(gè)值是布爾值,為true或false
  3. "string" —— 這個(gè)值是字符串
  4. "number" —— 這個(gè)值是數(shù)字
  5. "object" —— 這個(gè)值是對(duì)象(包括對(duì)象吃引、數(shù)組筹陵、日期和正則表達(dá)式)或null
  6. "function" —— 這個(gè)值是函數(shù)

typeof 操作符使用時(shí)有兩點(diǎn)值得注意:

(1) typeof null 的結(jié)果為 "object"。原理是這樣的镊尺,不同的對(duì)象在底層都表示為二進(jìn)制朦佩,在 JavaScript 中二進(jìn)制前三位都為 0 (數(shù)值的標(biāo)志位:1~3個(gè)字節(jié))的話會(huì)被判斷為 object 類型语稠, null 的二進(jìn)制表示是全 0,自然前三位也是 0弄砍,所以執(zhí)行 typeof 時(shí)會(huì)返回“ object ”仙畦。這個(gè)bug是第一版Javascript留下來(lái)的。在這個(gè)版本音婶,數(shù)值是以32字節(jié)存儲(chǔ)的慨畸,由標(biāo)志位(1~3個(gè)字節(jié))和數(shù)值組成型奥。
(2) 如下代碼:

var a;
typeof a; // "undefined"
typeof b; // "undefined"
a; // undefined
b; // ReferenceError: b is not defined

b未聲明但是使用 typeof 操作符檢測(cè)b未報(bào)引用錯(cuò)誤,而是返回undefined字符串碉京,說(shuō)明 typeof 有一個(gè)特殊的安全防范機(jī)制厢汹,實(shí)際工作中可以加以利用。因此在工作中承持妫可以看到類似如下的的代碼:

if (typeof DEBUG !== "undefined") {
 console.log("Debugging is starting")
}

而不是這樣的代碼:

if (DEBUG) {
 console.log("Debugging is starting")
}

因?yàn)镈EBUG變量一般只在debug.js文件中才有烫葬,而該文件只在開(kāi)發(fā)和測(cè)試時(shí)才被加載到瀏覽器中,在生產(chǎn)環(huán)境中不予加載凡蜻,若使用第二種寫法搭综,則在生產(chǎn)環(huán)境中會(huì)報(bào)引用錯(cuò)誤。

2.2 toString

  • typeof 操作符除了函數(shù)之外划栓,不能獲取其他對(duì)象的信息兑巾,使用 toString 則不管是object類型還是primitive類型,都能得到你想要的結(jié)果:
console.log(toString.call(123));  
console.log(toString.call(true));  
console.log(toString.call(Symbol('foo')));  
console.log(toString.call('some string'));  
console.log(toString.call([1, 2]));  
console.log(toString.call(new Date()));  
console.log(toString.call({  
    a: 'a'
}));

// output
[object Number]
[object Boolean]
[object Symbol]
[object String]
[object Array]
[object Date]
[object Object]

2.3 instanceof 操作符

  • toString 只可以用于判斷內(nèi)置的數(shù)據(jù)類型忠荞,對(duì)于我們自己構(gòu)造的對(duì)象蒋歌,它還是不能給出我們想要的結(jié)果,這時(shí)需要使用 instanceof委煤。
  • 對(duì)于使用構(gòu)造函數(shù)創(chuàng)建的對(duì)象堂油,我們通常使用 instanceof 來(lái)判斷某一實(shí)例是否屬于某種類型,例如:a instanceof Person碧绞,其內(nèi)部原理實(shí)際上是判斷Person.prototype是否在a實(shí)例的原型鏈中府框。
  • 檢測(cè)基礎(chǔ)數(shù)據(jù)類型用typeof操作符,檢測(cè)引用數(shù)據(jù)類型則用 instanceof 操作符讥邻,其語(yǔ)法如下所示:
    result = variable instanceof constructor迫靖,如果變量是給定引用數(shù)據(jù)類型(根據(jù)它的原型鏈來(lái)識(shí)別)的實(shí)例,那么 instanceof 操作符就會(huì)返回true兴使。如果使用instanceof操作符檢測(cè)基本數(shù)據(jù)類型的值袜香,則始終會(huì)返回false,因?yàn)榛绢愋筒皇菍?duì)象鲫惶。

3. Undefined類型和Null類型對(duì)比

Undefined類型和Null類型都是一值類型,即只有一個(gè)值的數(shù)據(jù)類型实抡。Undefined類型的值為特殊的undefined欠母,Null類型的值為特殊的null。

3.1 Undefined類型

undefined表示"缺少值"吆寨,就是此處應(yīng)該有一個(gè)值赏淌,但是還沒(méi)有定義。典型用法是:

  1. 變量被聲明了啄清,但沒(méi)有賦值時(shí)六水,就等于undefined俺孙。
  2. 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒(méi)有提供掷贾,該參數(shù)等于undefined睛榄。
  3. 對(duì)象沒(méi)有賦值的屬性,該屬性的值為undefined想帅。
  4. 函數(shù)沒(méi)有返回值時(shí)场靴,默認(rèn)返回undefined。

3.2 Null類型

null表示"沒(méi)有對(duì)象"港准,即該處不應(yīng)該有值旨剥。典型用法是:

  1. 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象浅缸。
  2. 作為對(duì)象原型鏈的終點(diǎn)轨帜。

3.3 注意

(1) undefined值是派生自null值的,因此位于null和undefined之間的相等操作符(==)總返回true衩椒。

null == undefined; //true
null === undefined; //false

(2) null是一個(gè)表示"無(wú)"的對(duì)象蚌父,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示"無(wú)"的原始值烟具,轉(zhuǎn)為數(shù)值時(shí)為NaN梢什。

Number(null); //0
Number(undefined); //NaN
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朝聋,隨后出現(xiàn)的幾起案子嗡午,更是在濱河造成了極大的恐慌,老刑警劉巖冀痕,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荔睹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡言蛇,警方通過(guò)查閱死者的電腦和手機(jī)僻他,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腊尚,“玉大人吨拗,你說(shuō)我怎么就攤上這事⌒龀猓” “怎么了劝篷?”我有些...
    開(kāi)封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)民宿。 經(jīng)常有香客問(wèn)我娇妓,道長(zhǎng),這世上最難降的妖魔是什么活鹰? 我笑而不...
    開(kāi)封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任哈恰,我火速辦了婚禮只估,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘着绷。我一直安慰自己蛔钙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蓬戚。 她就那樣靜靜地躺著夸楣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪子漩。 梳的紋絲不亂的頭發(fā)上豫喧,一...
    開(kāi)封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音幢泼,去河邊找鬼紧显。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缕棵,可吹牛的內(nèi)容都是我干的孵班。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼招驴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篙程!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起别厘,我...
    開(kāi)封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤虱饿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后触趴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氮发,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年冗懦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爽冕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡披蕉,死狀恐怖颈畸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情没讲,我是刑警寧澤眯娱,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站食零,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寂屏。R本人自食惡果不足惜贰谣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一娜搂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吱抚,春花似錦百宇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至既绕,卻和暖如春啄刹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凄贩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工誓军, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疲扎。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓昵时,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親椒丧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壹甥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,149評(píng)論 0 13
  • 第3章 基本概念 3.1 語(yǔ)法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡(jiǎn)單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,126評(píng)論 0 21
  • 第1章 JavaScript 簡(jiǎn)介 JavaScript 具備與瀏覽器窗口及其內(nèi)容等幾乎所有方面交互的能力壶熏。 歐洲...
    力氣強(qiáng)閱讀 1,129評(píng)論 0 0
  • 寫這篇文章的時(shí)候句柠,是大年三十,本來(lái)應(yīng)該和家人一起看春節(jié)聯(lián)歡晚會(huì)的久橙,但是看了一個(gè)小時(shí)感覺(jué)沒(méi)有什么勁俄占,我想今年春晚又會(huì)...
    AndyJennifer閱讀 1,491評(píng)論 0 4
  • 易小程經(jīng)過(guò)和客戶反復(fù)溝通討論,進(jìn)行產(chǎn)品實(shí)現(xiàn)后淆衷,發(fā)現(xiàn)有必要把其中一些客戶的產(chǎn)品靚點(diǎn)分享給同行缸榄; 讓依舊徘徊,不知道如...
    31f6398db51d閱讀 1,006評(píng)論 0 51