Javascript中的null和undefined

nullundefined在 JavaScript 里面是两个神奇的存在,你可以把它们都理解为没有值,但是实际上,他们的含义其实是不一样的。

先看一下 MDNundefined的定义。

undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量。undefined的最初值就是原始数据类型undefined

MDN 对于null的定义。

null特指对象的值未设置。它是 JavaScript 基本类型 之一,在布尔运算中被认为是 falsy

通过typeof获取两个对象的类型。

console.log(typeof null); // 输出object
console.log(typeof undefined); // 输出undefined

null竟然输出了object,它的表现和object是一致的,令人比较费解。

事实上,null是一个对空对象的引用,而undefined表示为没有值,这样它们之间不同的表现就好理解了。

比如,函数需要形参,但是当调用没有传递时,此时形参则为undefined

function func1(name) {
  console.log(name); // undefined
}
func1();

声明了变量但是没有赋初值时,也为undefined

var var1;
console.log(var1); // undefined

调用了对象中不存在的值的时候。

var obj = { k: '1' };
console.log(obj.k1); // undefined

而当我们想声明一个属性为一个对象的时候,但是初始化的时候这个对象还没有值,我们可以将其指定为null

var obj = null;

下面,我就按照这个思路理一遍它们之前表现的区别。

typeof 的结果不同

null虽然是一个空值,但是并不影响它的类型是什么,你可以把它当做一个对象,只不过这个对象是空的,所以typeof的结果为object就可以解释了。

undefined的类型为undefined,所以结果为undefined

强转布尔值或数字

console.log(!!null); // 输出false
console.log(!!undefined); // 输出false

正因为null是一个空对象引用,所以false是很好理解的,undefined没有值,自然也是false

console.log(+null); // 输出0
console.log(+undefined); // 输出NaN

把一个没有值的object强转为数字,所以输出了0,比如+[]的结果也是0。而undefined则直接转换为NaN

总结

总之,如果我们把null理解为一个引用,而这个引用的值是一个空值(空对象),把undefined理解为没有值,就理解了上述的一系列问题。

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注