JavaScript — Null vs. Undefined
初学者往往搞不清楚null
和undefined
的区别,本文深入剖析null
和undefined
的异同。
null
是啥?
关于null
有两点需要掌握:
-
null
是一个空
值 -
null
是被赋值来的
下面是个 Demo, 我们给 a 变量赋值为 null:
let a = null;
console.log(a);
// null
undefined
是啥?
undefined
通常表示一个变量单单被声明过,但是没有初始化。Demo:
let b;
console.log(b);
// undefined
你也可以特意的给一个变量赋值为undefined
,不过正常场景下不会这么使用。
let c = undefined;
console.log(c);
// undefined
还有一点,当访问对象不存在的属性时,我们会得到undefined
var d = {};
console.log(d.fake);
// undefined
null
& undefined
的相同点
在 JS 语言中,有6个falsy
的值,其中null
和undefined
是六个falsy
值中的两个。
falsy 值:
- false
- 0 (zero)
- “” (empty string)
- null
- undefined
- NaN (Not A Number)
其余所有的值则皆为truthy
。
另外, JS 语言中有六个原始数据类型,null
和undefined
是其中两个原始类型的值。原始数据类型:
- Boolean
- Null
- Undefined
- Number
- String
- Symbol
不在上述六种之内的就都是引用类型。但是有趣的是,当你使用typeof
来校验 null
时,返回的却是object
,可以简单理解为这是js 在最初引入的一个 bug。
let a = null;
let b;
console.log(typeof a);
// object
console.log(typeof b);
// undefined
null !== undefined
通过上面的介绍,你可能已经隐隐约约的感觉到了null
和undefined
是不同的,但非常相似。所以,null !== undefined
,null == undefined
。
?null
和undefined
存在差异的实际应用场景?
废话那么多,真正能用的地方,译者
就越到一个,es6的默认参数。
let logHi = (str = 'hi') => {
console.log(str);
}
/*默认值生效*/
logHi();
// hi
/*正常调用*/
logHi('bye');
// bye
/*默认值生效*/
logHi(undefined);
// hi
/*null 被当成有效的值*/
logHi(null);
// null
就上述代码,大家在和我一同回忆下 es5的默认参数的写法
let logHi = (str) => {
str = str || 'hi';
console.log(str);
}
logHi('bye');
// bye
logHi()
// hi
logHi(undefined);
// hi
logHi(null);
// hi
Summary
-
null
是被赋值出来的,它用来表示空 -
undefined
通常表示一个变量被声明了,但是没有被初始化 -
null
和undefined
都是falsy
值 -
null
和undefined
都是原始数据类型,但JS 语言的bug导致typeof null = object
-
null !== undefined
null == undefined
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。