Javascript中的null和undefined
null
和undefined
在 JavaScript 里面是两个神奇的存在,你可以把它们都理解为没有值,但是实际上,他们的含义其实是不一样的。
先看一下 MDN 对undefined
的定义。
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
理解为没有值,就理解了上述的一系列问题。
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=2803