JavaScript:undefined And null區別

下班吃飯的時候,同事偶然問瞭一個問題:undefined和null到底有什麼區別?無法回答,回去查閱相關資料,算瞭有瞭一個瞭解,做相關的總結,在開始之前,請看如下代碼,算是拋出這個問題:

console.info(undefined == null);    //true
console.info(undefined === null);   //false

上述結果可以給我們一個這樣的理解: undefined和null兩個值相等,但是他們含義不同。具體兩者有什麼區別,先理解下undefined和null在做分析。

undefined

undefined類型隻有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化,這個變量的值就是undefined。例如:

//1、聲明變量,未指定值
var var1;
console.info(typeof varl);      //undefined
//2、指定值為undefined
var var2 = undefined;
console.info(typeof var2);      //undefined

上面兩種寫法是等價的,未經初始化的值默認就會取得undefined值。

Tips:一般而言不需要顯示的把一個變量設置為undefined,undefined的主要目的在於比較,ECMA第三版引入這個值正是為瞭區分空對象指針null和未經初始化的變量

既然談到瞭null,這裡在多補充一點,對為初始化的變量執行typeof返回undefined值,對為聲明的變量執行typeof也會返回undefined值,如下例子:

var var3;
console.info(typeof var3);      //undefined
console.info(typeof var4);      //undefined

這個結果有邏輯上的合理性,雖然null和undefined在技術角度上有本質區別,但是實際中不可能對兩種變量進行操作。在這種情況下如果我們習慣聲明變量就進行初始化的時候,當typeof操作符返回“undefined”值時,我們就知道有變量尚未被聲明,而不是尚未初始化。

null

null類型也是隻有一個值null,從邏輯角度來看,null值表示一個空對象指針,不信?看如下代碼就知道瞭:

var var5 = null;
console.info(typeof var5);      //object

所以在變量是用於保存對象時,最後將之初始化為null,可以很方便的知道變量是否保存瞭一個對象的引用。

區別

分別的瞭解瞭這兩種類型,到這裡似乎有所理解,但又不具體。回到最初拋出的問題,在ECMAScript的原始類型中,是有undefined和null類型的,這兩種類型分別對應瞭屬於自己的唯一值undefined和null。undefined實際上是從null派生而來,這就可以解釋undefined==null為true瞭。

就undefined===null為false分兩個方面來理解:

內存

很顯然,他們的地址分配不一樣,我想著對於有後端基礎的同學來說很容易理解,具體如下圖:

QQ截圖20141030171514

用途

盡管undefined==null為true,但是他們的用途是不一樣的。就像前面所述,無論什麼情況都沒有必要將一個變量值顯示的指定為undefined,默認值為undefined,但是默認的規則對null卻不適用。因為null表示沒有指向對象的引用。

總的來說,undefined派生於null,他們是“==”的,另一層面上undefined表示沒有賦值的基本數據類型,null表示沒有賦值的引用數據類型,他們不能“===”。

發佈留言