一、相似性:
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是一个对象;