有點奇怪的是,JavaScript語言居然有兩個表示"無"的值:undefined和null。這是為什麼?
一、相似性
在JavaScript中,將一個變數賦值為undefined或null,老實說,幾乎沒差別。
上面程式碼中,a變數分別被賦值為undefined和null,這兩種寫法幾乎等價。
undefined和null在if語句中,都會被自動轉為false,相等運算子甚至直接報告兩者相等。
// undefined is false
if (!null)
console.log('null is false');
undefined == null
// true
上面程式碼說明,兩者的行為是何等相似!
既然undefined和null的意思與用法都差不多,為什麼要同時設定兩個這樣的值,這不是無端增加JavaScript的複雜度,令初學者困擾嗎? Google公司開發的JavaScript語言的替代品Dart語言,就明確規定只有null,沒有undefined!
二、歷史原因
Number(null)
// 5
/ >
但是,JavaScript的資料型別分成原始型別(primitive)和合成型別(complex)兩大類,Brendan Eich覺得表示"無"的值最好不是物件。
其次,JavaScript的最初版本沒有包含錯誤處理機制,發生資料型別不符時,往往是自動轉換型別或默默地失敗。 Brendan Eich覺得,如果null自動轉為0,很不容易發現錯誤。 因此,Brendan Eich又設計了一個undefined。
三、最初設計
Number(undefined)/ >
5 undefined
// NaN
程式碼如下:
Object.getPrototypeOf(Object.prototype> / null
函數 f(x){console.log(x)}
f() // 未定義
var o = new Object();
o.p // 未定義
var x = f();
x // 未定義