1. 程式人生 > 其它 >JS中的undefined與null

JS中的undefined與null

大多數計算機語言,有且僅有一個表示"無"的值,比如,C 語言的 NULLJava 語言的 nullPython 語言的 NoneRuby 語言的 nil

有點奇怪的是,JavaScript 語言居然有兩個表示"無"的值:undefinednull。這是為什麼?

異同點

相似

  1. 值僅有一個,在 JavaScript 中,undefinednull 都是基礎資料型別,他們的值有且僅有一個,分別為 undefinednull

  2. 沒有方法,undefinednull 都不能呼叫方法

  3. 表示 無,轉為布林型別時,結果均為 false

區別

  1. null 是一個關鍵字, undefined

    不是關鍵字,當定義變數時, undefined 可以作為變數名, null 不行

  2. null 的本質是一個標識為 '空' 的物件, undefinedwindow 物件的一個屬性, 雖然 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 是一個表示 "無" 的物件,轉為數值時為 0undefined 是一個表示 "無" 的原始值,轉為數值時為 NaN

Number(undefined); // NaN

5 + undefined; // NaN

用法

但是,上面這樣的區分,在實踐中很快就被證明不可行。目前,nullundefined 基本是同義的,只有一些細微的差別。

null 表示"沒有物件",即該處不應該有值。典型用法是:

  1. 作為函式的引數,表示該函式的引數不是物件。
  2. 作為物件原型鏈的終點。
Object.getPrototypeOf(Object.prototype); // null

undefined 表示"缺少值",就是此處應該有一個值,但是還沒有定義。典型用法是:

  1. 變數被聲明瞭,但沒有賦值時,就等於 undefined
  2. 呼叫函式時,應該提供的引數沒有提供,該引數等於 undefined
  3. 物件沒有賦值的屬性,該屬性的值為 undefined
  4. 函式沒有返回值時,預設返回 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