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 属性的值更改为可能破坏所有内容的任何其他值。