今天发现一个奇怪的问题,就是null为什么会检测为object,理论上来说应该是布尔值,
查阅相关资料后发现 typeof null 输出为object其实是之前一直存在的错误,带着这个问题,咱们来看一点 JavaScript 的历史。
我们都知道 "typeof null" 的 bug,它是在 JavaScript 的初版就存在的。在这个版本中,值以 32 位的单位存储,包括一个小型类型标记(1-3 位)和值的实际数据。类型标记存储在单元的较低位上。一共有 5 种类型:
- 000: object,表示这个数据是一个对象的引用。
- 1: int,表示这个数据是一个 31 位的有符号整型。
- 010: double,表示这个数据是一个双精度浮点数的引用。
- 100: string,表示这个数据是一个字符串的引用。
- 110: boolean,表示这个数据是一个布尔值。
两个值比较特殊:
-
undefined (JSVAL_VOID) 的值是 −2^30 整型(一个超出整型范围的数)。
-
null (JSVAL_NULL) 是机器码空指针。或者是:一个对象类型标记加上一个为零的引用。
如今应该很清楚为何 typeof 认为 null 是一个对象了:它检查了类型标记和类型标记表示的对象