是JS的一个遗留bug
// JavaScript 诞生以来便如此
typeof null === 'object';
在JavaScript这门语言当中,从设计到发布,总共花了不到10天的时候,由于JavaScript这门语言开发的周期时间特别短,所以留下了不少的bug,其中就包括typeof检测null为Object,其实null并不是Object的类型,那为什么会出现typeof检测出null为Object类型呢?
原因
- 在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。
- JavaScript存储都是以32位字节进行存储的,而标志位存储的时候,遵循如下的特点
| 前三位 | 数据类型 |
|---|---|
| 000 | 对象,数据是对象的应用。 |
| 001 | 整型,数据是31位带符号整数 |
| 010 | 双精度类型,数据是双精度数字 |
| 100 | 字符串,数据是字符串。 |
| 110 | 布尔类型,数据是布尔值。 |
- 对象的类型标签是 000
- 由于null作为机器代码的0号地址,也就是全部都是空
- 由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 000,typeof null 也因此返回 "object"。
- The history of “typeof null”
修复提案被拒绝
曾有一个 ECMAScript 的修复提案(通过选择性加入的方式),但被拒绝了。该提案会将其修正为正确的null基本数据类型
typeof null === 'null'。
怎么判断null类型
- 如果用 instanceof 来判断的话:
null instanceof null
// Uncaught TypeError: Right-hand side of 'instanceof' is not an object
- 判断一个值是否为空类型的最佳方法是直接和null比较:
value === null; //true or false
这里使用的是三等号操作符(===)而不是双等号。三等号操作符在进行比较的时候不会将变量强制转换为另一种类型。
当你比较undefined 和 null的时候,双等号会认为他们相等,三等号认为不相等。三等号认为这两个值类型不同。例子如下:
undefined == null; //true
undefined === null; //false