一、相似性:

1、在JavaScript中将某个变量赋值为undefined或null,实际上没有太大的差别,两者都是表示某个变量的值为“空”。

2、undefined和null在if语句中,都会被自动转为false,相等运算符甚至直接报告两者相等。

if(!undefined)
   console.log('undefined is false')
 //undefined is false

if(!null)
   console.log('null is false')
 //null is false

undefined == null   //true

但是:

undefined === null //false

null和undefined 两者相等,但是当两者做全等比较时,两者又不等。原因:

null: object类型,代表“空值”,代表一个空对象指针

undefined: undefined类型

二、历史原因

与javaScript的历史有关。1995年时,最初像java一样,只设置了null作为表示“无”的值。

根据c语言的传统,null被设计为可以自动转为0。

Number(null)
//0

5+null
//5

但是,javaScript的设计者Brendan Eich,觉得这样做还不够,有俩个原因。

1、null像在java里一样,被当成一个对象。但是,js的数据类型分为原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示“无”的值最好不是对象。

2、js的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或默默地失败。Brendan Eich觉得如果null自动转为0,很不容易发现错误。

so, Brendan Eich又设计了一个undefined。

三、最初设计

javaScript的最初版本是这样区分的:

null是一个表示“无”的对象,转为数值时为0;

undefined是一个表示“无”的原始值,转为数值时为NaN。

Number(undefined)
//NaN

5+undefined
//NaN

四、目前的用法

null和undefined基本是同义的,只有一些细微的差别。

(一)null表示“没有对象”,即该处不该有值。典型用法是:

1、作为函数的参数,表示该函数的参数不是对象。

2、作为对象原型链的终点。

Object.getPrototypeOf(Object.prototype)

//null

(二)undefined表示“缺少值”,即此处应该有一个值,但是还未定义。典型用法:

1、变量被声明了但未被赋值,就等于undefined

2、调用函数时,应提供的参数未提供,该参数等于undefined

3、对象没有赋值的属性,该属性的值为undefined

4、函数没有返回值时,默认返回undefined

var i;var 
i   //undefined

function f(x){
   console.log(x)      
}
f()   //undefined

var o=new Object();
o.p   //undefined

var x=f(x)
x   //undefined

五、总结区别

1、undefined不是关键字,而null是关键字;

var undefined=“” //undefined

var null=“” //会报错

2、undefined和null被转换为布尔值的时候,两者都为false;

3、undefined在和null进行==比较时两者相等,全等于比较时两者不等

4、使用Number()对undefined和null进行类型转换时前者为NaN,后者为0

5、undefined本质上是window的一个属性,而null是一个对象;