在JavaScript中,将一个变量赋值为undefined或null,感觉没啥区别,都表示“无”;但在实际应用中,远非如此,这两个之间区别的不明确可能会导致一些问题。
相似性
(1)undefined和null在if语句中,都会被自动转为false,加!转换为true,==运算符对于两者比较是相等的。
if (!undefined)
console.log('undefined is false');
// undefined is false
if (!null)
console.log('null is false');
// null is false
undefined == null
// true
(2)在JavaScript中,只有六个falsy值,null和undefined都包含在六个falsy值中,当进行逻辑判断时所有的Falsy值均为false。
false
0
'' (空字符串,''和""一样)
null
undefined
NaN
除了这六个值,JavaScript中的任何其他值都被认为是truthy值,当进行逻辑判断时均为true。
差异性
(1)数据类型区别
undefined类型只有一个值,undefined;null类型只有一个值,null。
也就是说undefined值和null值分别属于不同的数据类型,并且这两个数据类型都只有一个值,使用“typeof”运算符判断类型。
console.log(typeof undefined); // undefined
console.log(typeof null); // object
(2)转为数值区别
JavaScript的最初版本为了更好区分这两个值,是这样设定的:null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。
var a1= 5 + null;
console.log(a1) // 5
var a2= 5 + undefined;
console.log(a2) // NaN
(3)null !== undefined
如上所见,null和undefined不同,但有一些相似之处, 因此,ECMAScript规范规定null不严格等于undefined。
null !== undefined // true
null === undefined // false
在JavaScript中,==适用松散相等,意味着我们在将它们转换为通用类型后比较两个值。
只要记住null==undefined会返回true,因为它们是类似的值;但null===undefined会返回false,因为它们是不同类型的值。
实际用法
但是,上面的区分,在实践中都不常用。实际上,null和undefined被视为几乎同义的,只有一些细小的差别。
null表示一个变量被人为的设置为空对象,而不是原始状态,即该处不应该有值。一般会在以下 2 种场景中出现:
(1) 利用document.getElementById(‘XXX’) 寻找一个不存在的元素,将返回null。
console.log(null == document.getElementById('notExistElement')) // true
(2) 作为对象原型链的终点。
Object.getPrototypeOf(Object.prototype) // null
undefined表示一个变量自然的、最原始的状态值,就是此处应该有一个值,但是还没有定义。一般会在以下 4 种场景中出现:
(1)声明了一个变量,但没有赋值,就等于undefined。
var a
console.log(a); // undefined
(2) 函数定义了形参,但没有传递实参,该参数等于undefined。
//函数定义了形参 a
function f(a) {
console.log(a); // undefined
}
f(); //未传递实参
(3)访问对象上不存在的属性,该属性的值为undefined。
var a = new Object();
a.p // undefined
(4)函数没有返回值时,默认返回undefined。
var a = f();
a // undefined
所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。
最后引用玉伯大大对null和undefined的解释:
值类型的“虚无”用undefined,引用类型的“虚无”,用null。
网友评论