JavaScript 的undefine 與 null

參考自網站( 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 基本是同一的。只有一些細微的差異:

  1. 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 表示"缺乏值",就是該處應該有一個值,可是尚未定義。

相關文章
相關標籤/搜索