大多數(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