typeof null的结果是什么?为什么?

4 阅读1分钟

1,结果

typeof null  // 输出:"object"

2.原因(底层原理+历史bug)

1.js最初底层二进制设计问题

早期js引擎中,数据类型标识用低位二进制标记:

000: object   - 当前存储的数据指向一个对象。
  1: int      - 当前存储的数据是一个 31 位的有符号整数。
010: double   - 当前存储的数据指向一个双精度的浮点数。
100: string   - 当前存储的数据指向一个字符串。
110: boolean  - 当前存储的数据是布尔值。

如果最低位是 1,则类型标签标志位的长度只有一位;如果最低位是 0,则类型标签标志位的长度占三位,为存储其他四种数据类型提供了额外两个 bit 的长度。

有两种特殊数据类型:

  • undefined的值是 (-2)30(一个超出整数范围的数字);
  • null 的值是机器码 NULL 指针(null 指针的值全是 0)
  • 所有引用类型对象:标识以000开头
  • null在底层是全0二进制,刚好符合对象的标记规则

2.判定逻辑错误

引擎检测时,看到二进制以000开头,就归类为对象,因此typeof null返回object

3.为什么不修复

这是历史遗留bug

后期·ES规范想修复,但是会导致大量旧项目代码崩溃,为了向下兼容,永久保留这个问题

那也就是说null的类型标签也是000,和Object的类型标签一样,所以会被判定为Object