在<<Javascript 权威指南>>中,undefined常常被解释为:对应的值的缺失,对应以下四种情况:

1. 无赋值      变量被声明了,但没有赋值时,就等于undefined。

2. 属性不存在    引用对象中不存在属性,该属性的值为undefined。

3. 形参未赋值    调用函数时,应该提供的参数没有提供,该参数等于undefined。

4. 函数无返回值   函数没有返回值时,默认返回undefined。

实际上,undefined可以被当做除primitive原始类型和object类型之外的第三种类型:

window下的undefinded属性为undefined类型;这个类型只有一个值:undefined;

null被当做object类型,是因为typeof null === “object”;

null instatnceof Object === false是因为null处于原型链的顶端,而不是Object.prototype原型节点的子节点;

typeof     通过primitive,object,undefined类型判断
instanceof  通过原型链判断

在<<Speaking Javascript>>中,描述了设计undefined原因:

1. 避免类型转换上的错误:当因为编程疏忽时(声明了变量,却忘记给变量赋值,会引起异常)

Number(null)                // 0
Number(undefined)         // NaN

Boolean(null)               // false
Boolean(undefined)         // NaN

参考:

编程的细节之美——undefined与null的区别    http://www.tuicool.com/articles/B7FFzez