对本人而言,undefined和null这两个特殊值可谓纠结了我好长一段前端路程,大体意思能明白,但却很少去深究实质区别,最近又特地学习了一番前来分享。
六大基本类型(es6版)中,Undefined和Null占其中两位。大体上看,undefined和null都代表空值,实质却有所区别:
undefined: 表示该变量未定义或未赋值,是一种代表变量初始化的状态值。例如已经定义了a
变量,但没有赋值,获取a
变量将返回undefined;又例,当某函数已定义并要求传入形参,但调用函数时未传入实参,则函数形参将返回undefined。
var a;
console.log(a); //undefined
function func(x) {
return x;
}
func() //未传实参,形参为undefined
null: 表示空值,它本身就是一个空对象指针,如果说undefined是变量先天的状态值,那么null大可理解成变量对象后天被人为地赋予null这个空值。
var a = null;
console.log(a); //null
似乎好理解一点了,我们往下。当用typeof
获取变量类型时就可以发现,Undefined类型变量将返回Undefined
,而Null类型却会返回Object
!进一步证明前话,null是一个空对象指针,它本身就是一个代表空的对象值,我们可以说null值就是用来形容一个空对象变量。 对待Undefined和Null的区别问题上,你完全可以跟hr举例:Undefined就是一个纸用完了的卷纸筒,光秃秃没东西;Null就是连筒都没了,空。
问:那什么时候赋null值合适?
一、当这个变量将来会用来保存对象的话,最好是先为这个变量初始化null值。java精神:万物皆对象。换句话,我们应该明确地为对象变量空值的情况下初始为null,以方便区分undefined和null;
二、当这个变量准备弃用时,应该为变量赋null值,这在js中叫作解除引用。解除引用能让变量脱离执行环境,进一步回收内存。这在实战中能够防止变量循环引用,重复混乱地赋值。
最后作一个简单的undefined和null的对比:
undefined表示变量未定义或未赋值的初始状态值,是一个机器式标识;
null表示一个空对象变量,本身是空对象指针,是一个程序式标识。