Undefined與Null的區別


一、基本數據類型

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

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

二、undefined

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

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

  1.  
    var foo;
  2.  
    console.log(foo); // undefined
  3.  
    復制代碼

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

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

  1.  
    console.log(Object.foo); // undefined
  2.  
    console.log(typeof demo); // undefined
  3.  
    復制代碼

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

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

  1.  
    //函數定義了形參 a
  2.  
    function fn(a) {
  3.  
    console.log(a); // undefined
  4.  
    }
  5.  
    fn(); //未傳遞實參
  6.  
    復制代碼

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

4、使用void對表達式求值

  1.  
    void 0 ; // undefined
  2.  
    void false; // undefined
  3.  
    void []; // undefined
  4.  
    void null; // undefined
  5.  
    void function fn(){} ; // undefined
  6.  
    復制代碼

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

因此,undefined 一般都來自於某個表達式最原始的狀態值,不是人為操作的結果。當然,你也可以手動給一個變量賦值 undefined,但這樣做沒有意義,因為一個變量不賦值就是 undefined 。

三、null

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

1、一般在以下兩種情況下我們會將變量賦值為null

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

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

2、特殊的typeof null

當我們使用typeof操作符檢測null值,我們理所應當地認為應該返"Null"類型呀,但是事實返回的類型卻是"object"。

  1.  
    var data = null;
  2.  
    console.log(typeof data); // "object"
  3.  
    復制代碼

是不是很奇怪?其實我們可以從兩方面來理解這個結果:

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

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

四、總結

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM