分析JS中undefined與null在使用上的根本區(qū)別

大多數(shù)計算機(jī)語言箩张,有且僅有一個表示"無"的值,比如窗市,C語言的NULL先慷,Java語言的null,Python語言的None咨察,Ruby語言的nil论熙。

有點奇怪的是,Java語言居然有兩個表示"無"的值:undefined和null摄狱。這是為什么脓诡?科多大數(shù)據(jù)帶你來看看无午。

在Java中存在這樣兩種原始類型:Null與Undefined。這兩種類型常常會使Java的開發(fā)人員產(chǎn)生疑惑祝谚,在什么時候是Null宪迟,什么時候又是Undefined?

Undefined類型只有一個值,即undefined交惯。當(dāng)聲明的變量還未被初始化時次泽,變量的默認(rèn)值為undefined。

Null類型也只有一個值席爽,即null箕憾。null用來表示尚未存在的對象,常用來表示函數(shù)企圖返回一個不存在的對象拳昌。

js 代碼

var oValue;

alert(oValue == undefined); //output "true"

這段代碼顯示為true,代表oVlaue的值即為undefined,因為我們沒有初始化它钠龙。

js 代碼

alert(null == document.getElementById('notExistElement'));

當(dāng)頁面上不存在id為"notExistElement"的DOM節(jié)點時炬藤,這段代碼顯示為"true",因為我們嘗試獲取一個不存在的對象碴里。

js 代碼

alert(typeof undefined); //output "undefined"

alert(typeof null); //output "object"

第一行代碼很容易理解沈矿,undefined的類型為Undefined;第二行代碼卻讓人疑惑咬腋,為什么null的類型又是Object了呢羹膳?其實這是Java最初實現(xiàn)的一個錯誤,后來被ECMA沿用下來根竿。在今天我們可以解釋為陵像,null即是一個不存在的對象的占位符,但是在實際編碼時還是要注意這一特性寇壳。

js 代碼

alert(null == undefined); //output "true"

ECMA認(rèn)為undefined是從null派生出來的醒颖,所以把它們定義為相等的。但是壳炎,如果在一些情況下泞歉,我們一定要區(qū)分這兩個值,那應(yīng)該怎么辦呢匿辩?可以使用下面的兩種方法腰耙。

js 代碼

alert(null === undefined); //output "false"

alert(typeof null == typeof undefined); //output "false"

使用typeof方法在前面已經(jīng)講過,null與undefined的類型是不一樣的铲球,所以輸出"false"挺庞。而===代表絕對等于,在這里null === undefined輸出false睬辐。

歷史原因

在《Speaking Java》中發(fā)現(xiàn)了這個問題的答案挠阁!

原來宾肺,這與Java的歷史有關(guān)。1995年Java誕生時侵俗,最初像Java一樣锨用,只設(shè)置了null作為表示"無"的值。

根據(jù)C語言的傳統(tǒng)隘谣,null被設(shè)計成可以自動轉(zhuǎn)為0增拥。

Number(null)// 0

5 + null// 5

但是,Java的設(shè)計者Brendan Eich寻歧,覺得這樣做還不夠掌栅,有兩個原因。

首先码泛,null像在Java里一樣猾封,被當(dāng)成一個對象。但是噪珊,Java的數(shù)據(jù)類型分成原始類型(primitive)和合成類型(complex)兩大類晌缘,Brendan Eich覺得表示"無"的值最好不是對象。

其次痢站,Java的最初版本沒有包括錯誤處理機(jī)制磷箕,發(fā)生數(shù)據(jù)類型不匹配時,往往是自動轉(zhuǎn)換類型或者默默地失敗阵难。Brendan Eich覺得岳枷,如果null自動轉(zhuǎn)為0,很不容易發(fā)現(xiàn)錯誤呜叫。

因此空繁,Brendan Eich又設(shè)計了一個undefined。

目前的用法

但是朱庆,上面這樣的區(qū)分家厌,在實踐中很快就被證明不可行。目前椎工,null和undefined基本是同義的饭于,只有一些細(xì)微的差別。

null表示"沒有對象"维蒙,即該處不應(yīng)該有值掰吕。典型用法是:

(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象颅痊。

(2) 作為對象原型鏈的終點殖熟。

Object.getPrototypeOf(Object.prototype)// null

undefined表示"缺少值",就是此處應(yīng)該有一個值斑响,但是還沒有定義菱属。典型用法是:

(1)變量被聲明了钳榨,但沒有賦值時,就等于undefined纽门。

(2) 調(diào)用函數(shù)時薛耻,應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined赏陵。

(3)對象沒有賦值的屬性饼齿,該屬性的值為undefined。

(4)函數(shù)沒有返回值時蝙搔,默認(rèn)返回undefined缕溉。

var i;

i // undefined

function f(x){console.log(x)}

f() // undefined

var o = new Object();

o.p // undefined

var x = f();

x // undefined

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吃型,隨后出現(xiàn)的幾起案子证鸥,更是在濱河造成了極大的恐慌,老刑警劉巖勤晚,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敌土,死亡現(xiàn)場離奇詭異,居然都是意外死亡运翼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門兴枯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來血淌,“玉大人,你說我怎么就攤上這事财剖∮坪唬” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵躺坟,是天一觀的道長沦补。 經(jīng)常有香客問我,道長咪橙,這世上最難降的妖魔是什么夕膀? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮美侦,結(jié)果婚禮上产舞,老公的妹妹穿的比我還像新娘。我一直安慰自己菠剩,他們只是感情好易猫,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著具壮,像睡著了一般准颓。 火紅的嫁衣襯著肌膚如雪哈蝇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天攘已,我揣著相機(jī)與錄音炮赦,去河邊找鬼。 笑死贯被,一個胖子當(dāng)著我的面吹牛眼五,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彤灶,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼看幼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幌陕?” 一聲冷哼從身側(cè)響起诵姜,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搏熄,沒想到半個月后棚唆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡心例,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年宵凌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止后。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞎惫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出译株,到底是詐尸還是另有隱情瓜喇,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布歉糜,位于F島的核電站乘寒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匪补。R本人自食惡果不足惜伞辛,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夯缺。 院中可真熱鬧始锚,春花似錦、人聲如沸喳逛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姐呐,卻和暖如春殿怜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曙砂。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工头谜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸠澈。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓柱告,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笑陈。 傳聞我的和親對象是個殘疾皇子际度,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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

  • 第一章: JS簡介 從當(dāng)初簡單的語言,變成了現(xiàn)在能夠處理復(fù)雜計算和交互涵妥,擁有閉包乖菱、匿名函數(shù), 甚至元編程等...
    LaBaby_閱讀 1,656評論 0 6
  • 在JavaScript中存在這樣兩種原始類型:Null與Undefined蓬网。這兩種類型常常會使JavaScript...
    SunshineYSQ閱讀 343評論 0 0
  • 原文鏈接:http://www.cnblogs.com/eastday/archive/2010/03/03/16...
    老95閱讀 426評論 0 1
  • 前端07班 王語句JavaScript程序的執(zhí)行單位為行(line)窒所,也就是一行一行地執(zhí)行。一般情況下帆锋,每一行就是...
    ea203453e188閱讀 883評論 0 4
  • 皚如山上雪吵取,皎若云間月。聞君有兩意锯厢,故來相決絕皮官。今日斗酒會,明旦溝水頭哲鸳。躞蹀御溝上,溝水東西流盔憨。凄凄重凄凄徙菠,嫁娶亦...
    愛鳶尾的魚予閱讀 286評論 3 0