设计之初的区别

  1. JavaScript 发明于 1995年,那时候只有 null。因为是类 C 语言,设计的传统所有 null 为 0,所以 Number(null) === 0
  2. 设计者认为 JS 会与其它语言不一样,JAVA 中 null 是对象。而JS 中分为原始值与引用值,用 null 表示空对象不太够。所以设计了 undefined 作为原始值的初始值 | undefined | null | | —- | —- | | 原始值的初始值 | 对象的初始值 | | 未定义 | 空对象的引用 |

undefined

  1. 已声明未赋值的变量

    1. var a;
    2. console.log(a); // undefined
  2. 对象不存在的属性

    1. var a = {};
    2. console.log(a.b); // undefined
  3. 函数没有返回值的情况

    function test() {}
    console.log(test()); // undefined
    
  4. 函数实参参数没有传入,而获取形参 ```javascript function test(a){ console.log(a); // undefined }

test();


5. void 表达式
```javascript
console.log(void 1); // undefeind

typeof undefined // => undefined
IE8 之前 undefined 会出现重写的问题,之后全局变量 window.undefined 能被修改

类型转换

console.log(Boolean(undefined)); // false
console.log(String(undefined)); // "undefined"
console.log(Number(undefined)); // NaN

null

对象的初始值,空对象的引用

console.log(typeof null); // object 这个是历史遗留问题
                                                  // 在类 C 语言中都是用 null 作初始化对象
                          // 本身的值是原始值,但返回值是对象


var arr = []; // 空数组初始化
var obj = {}; // 空对象初始化

类型转换

console.log(Boolean(null)); // false
console.log(String(null)); // "null"
console.log(Number(null)); // 0

console.log(undefined == null); // true
console.log(undefined === null); // false