JavaScript中typeof null返回Object的原因:是Bug还是历史遗留问题?
为什么在JavaScript中
typeof null会返回"object"? 这个问题绝对是JavaScript里最有名的「历史遗留坑」之一,我刚学JS的时候也被它搞懵过——明明null就是用来表示「空值」的,怎么typeof就把它判定成对象了?
先给你个明确的结论:null不是对象,它是JavaScript官方定义的7种原始类型(primitive type)之一,其他六种分别是undefined、boolean、number、string、symbol、bigint。
那为什么typeof null会返回"object"呢?这得追溯到JavaScript的早期实现:
- 在最初的JS引擎里,每个值都会用一个32位的存储单元来保存,其中低3位是用来标记值的类型标签:比如000代表对象,1代表整数,100代表字符串,等等。
- 而
null被设计成了全0的二进制值,这样低3位自然也是000,正好和对象的类型标签重合。于是typeof操作符检查类型标签的时候,就误把null当成了对象。
这个问题其实很早就被发现了,但为什么没修复?因为修复它会打破大量已经上线的代码——很多开发者已经写出了依赖typeof null === 'object'逻辑的程序,一旦修改这个行为,这些代码都会报错。所以ECMAScript标准干脆把这个「bug」固化成了规范的一部分,一直保留到现在。
那怎么准确判断一个值是不是null呢?别用typeof,直接用严格相等运算符===就好了:
var is_null = null; console.log(typeof is_null); // 输出 "object" console.log(is_null === null); // 输出 true
这样就能精准区分null和真正的对象啦。
内容的提问来源于stack exchange,提问作者rameezmeans
相关产品推荐
相关产品推荐

