为什么 JavaScript 里 typeof null === 'object'?

45 阅读1分钟

背景

所有的前端开发者肯定都知道这个结论,typeof null === 'object'

image.png

但是为什么呢 ?

问题根源

在 JavaScript 的初始实现中,值在内存中使用 32 位格式表示,其中前3位作为类型检查操作的类型标记

以下是整数 1 的示例:

00100000000000000000000000000001

它的前三位为 001

类型系统使用以下二进制模式:

  • 001 - integer
  • 010 - double
  • 110 - boolean
  • 100 - string
  • 000 - object

null被实现为一个空指针,在内存中表示为0x00000000(二进制的 32 个零)。

typeof运算符执行类型检查时,它会屏蔽值的前三位。

对于null,这些位是000,与类型系统中的对象类型标签匹配。

typeof null这导致了返回的行为"object"

为啥不修复?

目前运行的应用非常多,如果改掉这个问题,可能导致非常多应用出现问题

给我们的思考

小心实现功能,并思考可能对长期的影响。 只是能跑起来,还不行,还需要优雅的跑🏃,并小心一些边界和可能对未来产生的影响。