一、历史原因
- 1995年JavaScript语言的第一版,所有值都设计成32位,
- 其中最低的3位用来表述数据类型,object对应的值是000。
- 当时,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),完全没考虑null,只把它当作object的一种特殊值,32位全部为0。 这是typeof null返回object的根本原因。
二、原理
- 原理是这样的,不同的对象在底层都表示为二进制,在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型, null 的二进制表示是全 0,自然前三位也是 0,所以执行 typeof 时会返回“ object ”。
- 这个bug是第一版Javascript留下来的。在这个版本,数值是以32字节存储的,由标志位(1~3个字节)和数值组成。标志位存储的是低位的数据。
- 这里有五种标志位:
- (1) 000:对象,数据是对象的应用。
- (2) 1:整型,数据是31位带符号整数。
- (3) 010:双精度类型,数据是双精度数字。
- (4) 100:字符串,数据是字符串。
- (5) 110:布尔类型,数据是布尔值。
- 最低位有一位,那么标志位只有一个1字节长度;或者是零位,标志位有3个字节长度,多出两个了字节,一共多出四种类型。