开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
什么是底型
底型的概念可能很多资深工程师都没听说过,我也是最近从老道
道格拉斯·克罗克福德
书中看到的,老道非常有名,甚至可能比JavaScript之父Brendan Eich
还有名,二十年前,JavaScript:世界上最被误解的编程语言
系列颠覆了不少人的认知,并且还著有《JavaScript语言精粹》、《JavaScript悟道》等经典书籍。
言归正传,底型是用于指示递归数据结构结尾的特殊值,也可用于表示值不存在。简言之,在JavaScript中,底型指的就是undefined
和null
。
其实还有一个NaN
,也算是一种底型,因为NaN
也可能是某些数据操作的终值,并且也是空。这样的话,底型可以理解为不存在的终值,正常的数字、字符串就不算。
NaN、undefined和null,如何选?
NaN
先看下NaN
,全称是Not a Number
,表示一个非数字的值。是一个全局变量,不可配置,不可写。也不可作为变量名。
NaN
和它的行为最初并不是JavaScript的产物,而是IEEE 754标准来规范的。
一般是在被操作值或结果原本是数字类型而实际不是的情况,会输出NaN
。例如:
parseInt('abc') // NaN
1 * Infinity // NaN
new Date("blabla").getTime() // NaN
判断是否是NaN
常用的方法有三种:Number.isNaN()
、isNaN()
和判断是否和自身相等。
Number.isNaN(NaN) // NaN
isNaN(NaN) // NaN
NaN === NaN // false
在Javascript语言中,NaN
是唯一一个不等于本身的值,所以可以通过这种方式来判断。null
和undefined
都等于本身。
null === null // true
undefined === undefined // true
刚才的两个判断是否是NaN的方法,也有所不同:
Number.isNaN('abc') // false
Number.isNaN(NaN) // true
isNaN('abc') // true
isNaN(NaN) // true
Number.isNaN(x)
仅判断x值本身是否NaN,而不会根据运算后的结果,而isNaN(x)
则是根据运算后的结果来判断的。
回到标题:NaN、undefined和null,如何选?如果在JavaScript语言中,只会选择一种底型,你觉得是哪个,NaN可以排除,它只是一个相对片面的底型。而其他两个,哪个更合适呢。