JavaScirpt中的undefinednull都表示没有值的概念。

使用非严格相等符比较它们时结果为true,虽然它们都是各自类型中的唯一值。

1
conosle.log(undefined == null);    // => true

但是这两个值的区别是什么呢?

它们之间最大的区别,也是对实际编程有重大影响的区别在于程序本身不会产生null,除非我们人为赋值;而程序中的操作只要不产生有意义的值,它就会产生undefined,比如未初始化的变量、没有指定返回值的函数的返回值、不存在的属性值的值都是undefined

1
2
3
4
5
6
7
8
9
let foo;

function bar() {}

const baz = {};

console.log(foo);    // => undefined
console.log(bar());    // => undefined
console.log(baz.foo);    // => undefined

从这个区别出发,我们在表示没有(有意义的)值时就最好只使用null,即最好永远不要在程序中人为赋值undefined,这样就能通过检查值是null还是undefined来区分这个值是我们在程序中有意赋值(null)还是操作没有产生有意义的值而自动赋值(undefined),提高程序的可维护性。

小结

对于编程实践而言,undefiendnull的区别只是当程序操作不产生有意义的值时,就会使用undefined;而对于null,除非人为赋值,一般不会产生null值(Object.prototype.prototype是个例外)。

基于这个区别,在程序中不人为赋值undefined,对于无意义的值一律只赋值为null,可以让我们通过检查值是null还是undefined来区分这个值是我们在程序中有意赋值(null)还是操作没有产生有意义的值而自动赋值(undefined),提高程序的可维护性。