JS 基礎篇(七):Undefined與Null的區別

1、基本數據類型

在介紹undefined與null以前,咱們先來了解一下ECMAScript中的數據類型。在ECMAScript中有六種簡單數據類型(也稱爲基本數據類型): Undefined、Null、Boolean、Number 和 String、Symbol (ES6中引入) 。還有一種複雜數據類型——Object。bash

Undefined和Null都只有一個值,分別對應着undefined和null。這兩種不一樣類型的值,既有着不一樣的語義和場景,又表現出較爲類似的行爲。函數

2、undefined

undefined 的字面意思就是:未定義的值 。這個值的語義是,但願表示一個變量最原始的狀態,而非人爲操做的結果 。 這種原始狀態會在如下 4 種場景中出現:spa

一、聲明一個變量,可是沒有賦值

var foo;
console.log(foo); // undefined
複製代碼

訪問 foo,返回了 undefined,表示這個變量自從聲明瞭之後,就歷來沒有使用過,也沒有定義過任何有效的值。指針

二、訪問對象上不存在的屬性或者未定義的變量

console.log(Object.foo); // undefined
console.log(typeof demo); // undefined
複製代碼

訪問 Object 對象上的 foo 屬性,返回 undefined , 表示Object 上不存在或者沒有定義名爲 foo 的屬性;對未聲明的變量執行typeof操做符返回了undefined值。code

三、函數定義了形參,但沒有傳遞實參

//函數定義了形參 a
function fn(a) {
    console.log(a); // undefined
}
fn(); //未傳遞實參
複製代碼

函數 fn 定義了形參 a,但 fn 被調用時沒有傳遞參數,所以,fn 運行時的參數 a 就是一個原始的、未被賦值的變量。對象

四、使用void對錶達式求值

void 0 ; // undefined
void false; // undefined
void []; // undefined
void null; // undefined
void function fn(){} ; // undefined
複製代碼

ECMAScript 明確規定 void 操做符 對任何表達式求值都返回 undefined ,這和函數執行操做後沒有返回值的做用是同樣的,JavaScript 中的函數都有返回值,當沒有 return 操做時,就默認返回一個原始的狀態值,這個值就是 undefined,代表函數的返回值未被定義。ip

所以,undefined 通常都來自於某個表達式最原始的狀態值,不是人爲操做的結果。固然,你也能夠手動給一個變量賦值 undefined,但這樣作沒有意義,由於一個變量不賦值就是 undefined 。內存

3、null

null 的字面意思是:空值 。這個值的語義是,但願表示一個對象被人爲的重置爲空對象,而非一個變量最原始的狀態 。 在內存裏的表示就是,棧中的變量沒有指向堆中的內存對象。string

一、通常在如下兩種狀況下咱們會將變量賦值爲null

  • 若是定義的變量在未來用於保存對象,那麼最好將該變量初始化爲null,而不是其餘值。換句話說,只要意在保存對象的變量尚未真正保存對象,就應該明確地讓該變量保存null值,這樣有助於進一步區分null和undefined。it

  • 當一個數據再也不須要使用時,咱們最好經過將其值設置爲null來釋放其引用,這個作法叫作解除引用。不過解除一個值的引用並不意味着自動回收改值所佔用的內存。解除引用的真正做用是讓值脫離執行環境,以便垃圾收集器在下次運行時將其回收。解除引用還有助於消除有可能出現的循環引用的狀況。這一作法適用於大多數全局變量和全局對象的屬性,局部變量會在它們離開執行環境時(函數執行完時)自動被解除引用。

二、特殊的typeof null

當咱們使用typeof操做符檢測null值,咱們理所應當地認爲應該返"Null"類型呀,可是事實返回的類型倒是"object"。

var data = null;
console.log(typeof data); // "object"
複製代碼

是否是很奇怪?其實咱們能夠從兩方面來理解這個結果:

  • 一方面從邏輯角度來看,null值表示一個空對象指針,它表明的其實就是一個空對象,因此使用typeof操做符檢測時返回"object"也是能夠理解的。

  • 另外一方面,其實在JavaScript 最初的實現中,JavaScript 中的值是由一個表示類型的標籤和實際數據值表示的(對象的類型標籤是 0)。因爲 null 表明的是空指針(大多數平臺下值爲 0x00),所以,null的類型標籤也成爲了 0,typeof null就錯誤的返回了"object"。在ES6中,當時曾經有提案爲歷史平凡, 將type null的值糾正爲null, 但最後提案被拒了,因此仍是保持"object"類型。

4、總結

用一句話總結二者的區別就是:undefined 表示一個變量天然的、最原始的狀態值,而 null 則表示一個變量被人爲的設置爲空對象,而不是原始狀態。因此,在實際使用過程當中,爲了保證變量所表明的語義,不要對一個變量顯式的賦值 undefined,當須要釋放一個對象時,直接賦值爲 null 便可。

相關文章
相關標籤/搜索