程序員是這樣區分Null和Undefined

Null類型

Null類型是第二個只有一個值的數據類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空對象指針,而這也正是使用typeof操作符檢測null值時會返回"object"的原因,如下面的例子所示:

var car = null;

alert(typeof car); ? ?// "object"

如果定義的變量準備在將來用于保存對象,那么最好將該變量初始化為 null 而不是其他值。這樣一來,只要直接檢查null值就可以知道相應的變量是否已經保存了一個對象的引用,如下面的例子所示:

if (car != null){

// 對car對象執行某些操作

}

實際上,undefined值是派生自null值的,因此ECMA-262規定對它們的相等性測試要返回true:

alert(null == undefined); ? ?//true

這里,位于null和undefined之間的相等操作符(==)總是返回true,不過要注意的是,這個操作符出于比較的目的會轉換其操作數,盡管null和undefined有這樣的關系,但它們的用途完全不同。如前所述,無論在什么情況下都沒有必要把一個變量的值顯式地設置為undefined,可是同樣的規則對null卻不適用。換句話說,只要意在保存對象的變量還沒有真正保存對象,就應該明確地讓該變量保存null值。這樣做不僅可以體現null作為空對象指針的慣例,而且也有助于進一步區分null和undefined。

Undefined類型

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

var message;

alert(message == undefined); //true

這個例子只聲明了變量message,但未對其進行初始化。比較這個變量與undefined字面量,結果表明它們是相等的。這個例子與下面的例子是等價的:

var?message?=?undefined;

alert(message?==?undefined);?//true

這個例子使用undefined值顯式初始化了變量message。但我們沒有必要這么做,因為未經初始化的值默認就會取得undefined值。

一般而言,不存在需要顯式地把一個變量設置為undefined值的情況。字面值undefined的主要目的是用于比較,而ECMA-262第3版之前的版本中并沒有規定這個值。第3版引入這個值是為了正式區分空對象指針與未經初始化的變量。

不過,包含undefined值的變量與尚未定義的變量還是不一樣的??纯聪旅孢@個例子:

var message; // 這個變量聲明之后默認取得了undefined值

// 下面這個變量并沒有聲明

// var age

alert(message); ? ?// "undefined"

alert(age); ? ?// 產生錯誤

運行以上代碼,第一個警告框會顯示變量message的值,即"undefined"。而第二個警告框——由于傳遞給alert()函數的是尚未聲明的變量age——則會導致一個錯誤。對于尚未聲明過的變量,只能執行一項操作,即使用typeof操作符檢測其數據類型(對未經聲明的變量調用delete不會導致錯誤,但這樣做沒什么實際意義,而且在嚴格模式下確實會導致錯誤)。

然而,令人困惑的是:對未初始化的變量執行typeof ?操作符會返回 ?undefined ?值,而對未聲明的變量執行typeof操作符同樣也會返回undefined值。來看下面的例子:

var message; // 這個變量聲明之后默認取得了undefined值

// 下面這個變量并沒有聲明

// var age

alert(typeof message); ? ?// "undefined"

alert(typeof?age);????//?"undefined"

結果表明,對未初始化和未聲明的變量執行typeof操作符都返回了undefined值;這個結果有 其邏輯上的合理性。因為雖然這兩種變量從技術角度看有本質區別,但實際上無論對哪種變量也不可能執行真正的操作。

提示:

即便未初始化的變量會自動被賦予undefined值,但顯式地初始化變量依然是明智的選擇。如果能夠做到這一點,那么當typeof操作符返回"undefined"值時,我們就知道被檢測的變量還沒有被聲明,而不是尚未初始化。

本文由web前端精髓為您提供(喜歡我的文章可以掃一掃圖中二維碼關注我?。?/p>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容