JavaScript中的null和undefined,看上去非常像,在使用的时候很不容易区分,也很难分辨什么时候是null,什么时候是undefined,以及它们的真正含义,但实际上它们还是有很多区别的。
什么是null?
对于js中的null来说,有以下两个特点:
- null表示这个变量的值是空的,是一个不存在的值
- null表示这个变量已经被分配了值
一个简单的例子:
let a = null;
console.log(a);
// null
什么是undefined?
undefined指的是已经定义了一个变量,但是没有给这个变量赋值,这个时候这个变量就是undefined。
比如:
let b;
console.log(b);
// undefined
当然,我们也可以手动的将undefined赋给一个变量:
let c = undefined;
console.log(c);
// undefined
如果我们想访问对象里不存在的字段,同样会得到undefined:
var d = {};
console.log(d.fake);
// undefined
null和undefined有什么共同点?
1. 都会被判断为false
在JavaScript中,null和undefined都会被判断为false,所有会被判断为false的值一共有6个,分别是:
- false
- 0 (zero)
- "" (empty string)
- null
- undefined
- NaN (Not A Number)
其它所有的值在JavaScript中都会被判断为true
2. 都是原始值
在JavaScript中,一共有6种原始值,null和undefined都属于原始值。JavaScript的6个原始值分别为:
- Boolean
- Null
- Undefined
- Number
- String
- Symbol
其它所有的值都是对象(包括object、function、array等)
3. null == undefined
如果直接去 == 运算符去比较null和undefined的话,会得到true。
是因为在JavaScript中,== 运算符测试的相等性不是很严格,并且执行了预类型强制转换。这意味着我们将两个值转换为通用类型后进行比较。
如果使用带类型的比较,即===,则null === undefined会得到false
实际使用差异
如果我们这样定义一个函数(这个函数有一个参数str,如果调用该函数时没有传入值,则str有一个默认值'hi'):
let logHi = (str = 'hi') => {
console.log(str);
}
如果我们不传参数直接调用方法,变量str会有一个默认值'hi',控制台输出'hi':
logHi();
// hi
如果传入一个'bye',则str被赋值,并在控制台输出'bye':
logHi('bye');
// bye
如果我们分别传入null和undefined呢?
logHi(undefined);
// hi
logHi(null);
// null
如果传入undefined,函数会认为没有传入参数,变量str会被赋予默认值;而如果传入null,则函数认为传入的值为null,并将null赋值给变量str。
null的类型是object?
有趣的是,我们使用typeof获取null和undefined的类型时,会得到null是一个object。
let a = null;
let b;
console.log(typeof a);
// object
console.log(typeof b);
// undefined
在JavaScript最开始被创建时,使用typeof去判断null的类型就会得到object。
很多人都认为这是最开始JavaScript实现上的一个错误。
总结
- null是一个已经分配的值,代表特殊的含义(空,什么都没有)
- undefined是指一个变量被声明了但是没有分配值,这个时候这个变量就是undefined
- null和undefined在JavaScript中都会被判断为false
- null和undefined都是JavaScript里的原始值(但是typeof null是object)
- null !== undefined,但是,null == undefined