typeof null 返回 "object" 是历史遗留错误,因早期32位存储中null全零值被误判为对象类型,为兼容性保留至今;null实为原始类型,安全判断应使用 value === null 或 value == null。
因为 javascript 诞生时的底层实现缺陷,且为向后兼容一直保留至今。
二进制类型标记的历史遗留
1995 年初版 JavaScript 中,所有值用 32 位存储,前 3 位作为类型标识。对象类型的标识是 000,而 null 在内存中被表示为全零(即 0x00000000),其前三位自然也是 000,于是被误判为 “object”。
后来虽然 null 被明确规范为独立的原始类型(Primitive),但改变 typeof null 的返回值会导致大量旧代码出错,所以这个“bug”被保留下来,成为语言标准的一部分。
它不是对象,只是 typeof 判错了
null 是原始值(Primitive),不是引用类型,不能调用方法,也没有原型链。它和 {}、new Date() 等真正对象完全不同。
验证方式:
-
typeof null === 'object'→ true(历史判定) -
Object.prototype.toString.call(null)→"[object Null]" -
null instanceof Object→ false -
JSON.stringify(null)→"null"(序列化为字面量,非对象结构)
实际开发中怎么安全判断?
别依赖 typeof 判断 null,应直接用严格相等:
- 检查是否为
null:用value === null - 检查是否为空值(
null或undefined):用value == null(松散相等,安全且简洁) - 避免
typeof value === 'object' && value !== null这类组合判断——冗余且易错
为什么 undefined 没这个问题?
undefined 在最初设计中就作为独立类型存在,其二进制标识未与对象冲突,所以 typeof undefined 正确返回 "undefined"。它的行为始终一致,没有兼容性包袱。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











