undefined 和 null

乍一看,似乎 nullundefined 基本相同,但是存在細微但重要的差異。

undefined 是編譯器中沒有值,因為它應該是一個值,沒有放置一個,就像未賦值變數的情況一樣。

  • undefined 是一個全域性值,表示缺少指定值。
    • typeof undefined === 'undefined'
  • null 是一個物件,表示變數已被明確賦值為無值
    • typeof null === 'object'

將變數設定為 undefined 意味著變數實際上不存在。某些程序(如 JSON 序列化)可能會從物件中刪除 undefined 屬性。相反,null 屬性表示將被保留,因此你可以明確地傳達屬性的概念。

以下評估為 undefined

  • 宣告但未賦值的變數(即已定義)
    • let foo;
      console.log('is undefined?', foo === undefined);
      // is undefined? true
      
  • 訪問不存在的屬性的值
    • let foo = { a: 'a' };
      console.log('is undefined?', foo.b === undefined);
      // is undefined? true
      
  • 不返回值的函式的返回值
    • function `foo()` { return; }
      console.log('is undefined?', `foo()` === undefined);
      // is undefined? true
      
  • 宣告但已從函式呼叫中省略的函式引數的值
    • function foo(param) { 
        console.log('is undefined?', param === undefined);
      }
      foo('a');
      foo();
      // is undefined? false
      // is undefined? true
      

undefined 也是全域性 window 物件的屬性。

// Only in browsers
console.log(window.undefined); // undefined
window.hasOwnProperty('undefined'); // true    

Version < 五

在 ECMAScript 5 之前,你實際上可以將 window.undefined 屬性的值更改為可能破壞所有內容的任何其他值。