关于typeof 检测 null 为 'object'的原因

163 阅读2分钟

是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