參考自網站( http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html ),並稍做整理。html
<一> 類似性java
在JavaScript 中,將一個變量賦值爲 undefined 或 null,幾乎沒有區別。函數
var a = undefined; var a = null;
在使用上:網站
1. undefined 和 null 在if 語句中都會自動轉爲 false。spa
if (!undefined) console.log('undefined is false');// undefined is false if (!null) console.log('null is false');// null is false
2.相等運算符(== 或 ===)報告二者相等prototype
undefined == null // true
既然undefined 與 null 的含義與用法都差很少,爲何要同時設置兩個這樣的值呢?
設計
<二> undefined 與 null 同時存在的歷史緣由
code
JavaScript 剛誕生的時候,最初像java 同樣,只設置了null 做爲表示 "無" 的值。根據C語言的傳統,null 被設計成可自動轉爲0.
htm
Number(null) // 0 5 + null // 5
可是JavaScript 的設計者 Brendan Eric 以爲這樣作不夠,有兩個緣由:對象
首先,null 像在 Java 裏同樣,被當成一個對象。可是JavaScript 的數據類型分紅原始類型(primitive) 和 合成類型(complex)兩大類, Brendan Eric 舉得表示"無"的值最好不是對象。
其次,JavaScript 的最第一版本沒有包括錯誤處理機制,發生數據類型不匹配時,每每是自動轉型或者默默地失敗。 Brendan Eric 以爲,若是null 自動轉爲0,很不容易發現錯誤。
隱藏,Brendan Eric 又設計了一個 undefined.
<三>.最初設計
JavaScript的最第一版本是這樣區分的:null是一個表示"無"的對象,轉爲數值時爲0;undefined是一個表示"無"的原始值,轉爲數值時爲NaN。
Number(undefined) // NaN 5 + undefined // NaN
<四>.目前的用法
可是上面這樣的區分,在實際中很快就被證實不可行。目前 null 和 undefined 基本是同一的。只有一些細微的差異:
null 表示"沒有對象",即該處不該該有值。典型的用法是:
做爲函數的參數,表示該函數的參數不是對象。
做爲對象原型鏈的終點。
舉例:
Object.getPrototypeOf(Object.prototype) // null
2. 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
作個小小總結吧:
null 表示"沒有對象",即該處不該該有值;
undefined 表示"缺乏值",就是該處應該有一個值,可是尚未定義。