网上有很多关于null和undefined区别的论述,看似讲了很多知识,但又好像没什么用,无法指导实际开发。结论大多是null和undefined基本一样,只有细微差别,是历史设计错误的产物,甚至应该把其中一个从语言中去掉。
实际上,这两个值还是有很大的区别的,并且这两个值还有存在的意义。
undefined代表未定义,也就是不存在的意思。也可以换个角度,就是应该有值,但是还没赋值,连null值都没有赋予。
var foo;
console.log(foo); // undefined
foo = null;
console.log(foo); // null
console.log(bar); // Uncaught ReferenceError: bar is not defined
null则代表有值,是存在的,但是为空值。空值不是不存在,而是有一个叫做空值
的值。在语言层面,null是object,是一种特殊的空对象
。如果把一个变量赋予null,则该变量原先指向的对象可以被GC回收,释放内存空间。当然也可以认为null是null类型,这不影响实际的意义。
console.log(typeof(null)); // object
console.log(typeof(undefined)); // undefined
在 TypeScript 中,有undefined和null类型,这两种类型都只有唯一一个值,就是它们自己。并且是其它所有类型的子类型,可以赋值给任何类型。
let u: undefined = undefined;
let n: null = null;
let num: number = u;
上面说了那么多,好像除了增加复杂性之外,并没有什么实际的用处。
下面用代码演示这两种类型的实际用法,可以体会不存在
和空值
具体有什么区别和用处:
var foo = {a:1, b:2};
console.log(JSON.stringify(foo)); // {"a":1,"b":2}
foo = {...foo, a:null};
console.log(JSON.stringify(foo)); // {"a":null,"b":2}
foo = {...foo, a:undefined};
console.log(JSON.stringify(foo)); // {"b":2}
从上面的代码可以看到,把一个对象的属性设置成undefined后,这个属性就消失了、不存在了。而设置成null,这个属性还是存在,只不过是null值。
如果你想让对象中某个属性消失,那么就把它设置成undefined吧。这也许是undefined和null同时存在的最大的意义。