看看祖师爷是怎么说的
平时,我们在使用 Javascript 时,undefined
和 null
几乎没有区别。
而在使用 TS 时,我们又明确的可以知道,它们是完全两种不同的类型,不可以互相赋值,在使用时并不完全等价,这就对我们的使用造成了困惑:到底什么时候用哪个,到底有什么区别。
据我所知,目前 JS 是唯一一个拥有两个表示“空”的类型的语言。
查阅了一些资料,了解到,最早的 js 的版本中,是只有 null
的,JS 的一些设计参照了其他语言,而 null 在类型转换时可以转换为 0。
在 C 语言中,函数执行成功或是失败是人为约定的,比如比较常见的约定是执行成功返回 0,失败则返回其他数字。
而如果我们的 JS 也是这样,null 在自动转换为 0 的时候,往往不容易发现错误。
不知道是不是这个原因,Brendan Eich 觉得 null
不够好, 又在后续的版本中又设计了一个 undefined
,而且已经添加了并被广泛使用。
undefined
在转换成数字类型时,返回 NaN
,这是它们直接一个明显的区别。
undefined
看过一些分享,说大厂里不允许直接使用 undefined
,而是使用 void 0
来代替,它的返回结果是 undefined
。
因为,undefined
不是 JS 里的关键字,它是 window.undefined
,即 window 上的一个变量,在现代的 JS 中,它被属性描述符号限制了不可修改了,避免我们犯低级错误。
而在非全局作用域下,我们依然可以 let undefined = xxx
这还是需要小心的,我们不妨学习大厂的做法,在 code review 时,避免团队里出现显示使用 undefined
的代码。
undefined
是一个变量,null
是一个关键字,这是它们的第二个区别。
截图是 2015 年的一则推文,地址是:https://twitter.com/BrendanEich/status/617450289889607681
大致意思是一个开发者问为什么 typeof null
的结果是 object
,祖师爷首先回复了,null
表示 no object
, undefined
表示 no value
。
随后回答了这个问题,表示 typeof null
的结果是 object
是一个漏洞。
所以第三个区别是 typeof null
的结果是 object
,而 typeof undefined
是 undefined
。
我们知道:
undefined
,对象的没有赋值的属性也是一样。undefined
。null
。undefined
。document.getElementById('')
如果没有选择器匹配返回的是 null。这种实现和祖师爷说的是保持一致的,甚至我们如果把 null
的 typeof
的设计缺陷,理解为 null
是特别的一种对象,表示这个对象不存在,是“空对象”,也是没有问题的。
再总结一下,前文提到的具体几处区别:
undefined
在转换成数字类型时,回返回 NaN
;null
则是 0。undefined
是一个变量,null
是一个关键字typeof null
的结果是 object
,而 typeof undefined
是 undefined
。在 JS 里我们混着用并没有什么区别,但是现在我们知道了一点它们的区别,祖师爷也给出了使用的建议,我们基本上按照他的建议来使用即可。