JS中的undefined與null
大多數計算機語言,有且僅有一個表示"無"的值,比如,C
語言的 NULL
,Java
語言的 null
,Python
語言的 None
,Ruby
語言的 nil
。
有點奇怪的是,JavaScript
語言居然有兩個表示"無"的值:undefined
和 null
。這是為什麼?
異同點
相似
-
值僅有一個,在
JavaScript
中,undefined
和null
都是基礎資料型別,他們的值有且僅有一個,分別為undefined
和null
-
沒有方法,
undefined
和null
都不能呼叫方法 -
表示 無,轉為布林型別時,結果均為
false
區別
-
null
是一個關鍵字,undefined
undefined
可以作為變數名,null
不行 -
null
的本質是一個標識為 '空' 的物件,undefined
是window
物件的一個屬性, 雖然undefined
直接翻譯的結果是 '未定義',但實質上undefined
是一個已經定義了的屬性,只不過它的值叫做 '未定義'
歷史原因
這與 JavaScript
的歷史有關。1995 年 JavaScript 誕生 時,最初像 Java
一樣,只設置了 null
作為表示 "無" 的值。
根據 C
語言的傳統,null
被設計成可以自動轉為 0
。
Number(null); // 0 5 + null; // 5
但是,JavaScript
的設計者 Brendan Eich
,覺得這樣做還不夠,有兩個原因。
首先,null
像在 Java
裡一樣,被當成一個物件。但是,JavaScript
的資料型別分成原始型別(primitive
)和合成型別(complex
)兩大類,Brendan Eich
覺得表示 "無" 的值最好不是物件。
其次,JavaScript
的最初版本沒有包括錯誤處理機制,發生資料型別不匹配時,往往是自動轉換型別或者默默地失敗。Brendan Eich
覺得,如果 null
自動轉為 0
,很不容易發現錯誤。
因此,Brendan Eich
又設計了一個 undefined
。
最初的設計
JavaScript
的最初版本是這樣區分的:null
是一個表示 "無" 的物件,轉為數值時為 0
;undefined
是一個表示 "無" 的原始值,轉為數值時為 NaN
。
Number(undefined); // NaN
5 + undefined; // NaN
用法
但是,上面這樣的區分,在實踐中很快就被證明不可行。目前,null
和 undefined
基本是同義的,只有一些細微的差別。
null
表示"沒有物件",即該處不應該有值。典型用法是:
- 作為函式的引數,表示該函式的引數不是物件。
- 作為物件原型鏈的終點。
Object.getPrototypeOf(Object.prototype); // null
undefined
表示"缺少值",就是此處應該有一個值,但是還沒有定義。典型用法是:
- 變數被聲明瞭,但沒有賦值時,就等於
undefined
。 - 呼叫函式時,應該提供的引數沒有提供,該引數等於
undefined
。 - 物件沒有賦值的屬性,該屬性的值為
undefined
。 - 函式沒有返回值時,預設返回
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
參考:http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html