JavaScript中存在2個代表資訊不存在的特殊值:null和undefined。個人認為可以從以下角度來理解這兩個特殊值之間的差異:
1.null代表有儲存資訊的容器(例如之前被賦過值的變數),但該容器中的內容為空。
2.undefined代表不存在用於儲存資訊的容器。
JavaScript中的null與其它多數程式語言中的null沒有什麼區別,基本上用於表示資訊值為空;而在JavaScript中下述情況下表達式返回結果為undefined:
1.從未被賦過值的變數。
2.存取某個物件不存在的屬性值。
3.存取數組中不存在的成員。
4.呼叫沒有return語句的函數。
5.呼叫return語句為空(“return ;”)的函數。
事實上,和Infinity、NaN一樣,undefined在JavaScript中是一個全域變量,在ECMAScript 3中甚至可以被賦予其它值。 ECMAScript 5修正了這個錯誤,並將undefined變數設定為唯讀。
對於null和undefined之間的比較,可以使用===全等運算子。如果使用普通的==運算符,null與undefined是等價的:
在程式編寫過程中,如果需要對某個變數賦以空值,一般使用null而不是undefined。原因在於:
1.undefined一般認為是屬於系統層面的、報錯層面的資訊缺失。
2.null一般認為是屬於程式設計層面的、邏輯操作層面的資訊值為空。
如果在程式中涉及型別轉換,那麼當轉換為number型別時,null和undefined的結果是不一樣的:
1.undefined轉換為number的結果是NaN。
2.null轉換為number的結果是0。
值得一提的是,空字串和空數組轉換成number後的結果也是0。
至於JavaScript中為什麼要設計兩個表示「沒有」的值,可以參考阮一峰的部落格文章。
實驗
在下述實驗程式碼中,表達式結果皆為undefined:
function Sample(x){
this.x = x;
}
var s = new Sample();
console.log(s.x)
console.log(s.notExistVariable);
var n = [2,3,4];
console.log(n[8]);
function test(){
//no return value for this function
}
console.log(test());
function test2(){
return;
}
console.log(test2());