底型

76 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

什么是底型

底型的概念可能很多资深工程师都没听说过,我也是最近从老道 道格拉斯·克罗克福德书中看到的,老道非常有名,甚至可能比JavaScript之父Brendan Eich还有名,二十年前,JavaScript:世界上最被误解的编程语言系列颠覆了不少人的认知,并且还著有《JavaScript语言精粹》、《JavaScript悟道》等经典书籍。

言归正传,底型是用于指示递归数据结构结尾的特殊值,也可用于表示值不存在。简言之,在JavaScript中,底型指的就是undefinednull

其实还有一个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是唯一一个不等于本身的值,所以可以通过这种方式来判断。nullundefined都等于本身。

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可以排除,它只是一个相对片面的底型。而其他两个,哪个更合适呢。