typeof null 返回 "object" 是历史遗留 bug,源于早期 SpiderMonkey 引擎用 32 位标签表示值时误将全零的 null 判为对象,为向后兼容被标准保留;正确判断 null 应用 value === null,而 Object.prototype.toString.call(null) 可返回 "[object Null]" 实现精准识别。

JavaScript 中 typeof null 返回 "object" 是一个历史遗留 bug,不是设计意图,也违背直觉,但它被保留至今是为了向后兼容。
这是个早期实现错误
在 JavaScript 最初的实现(Netscape Navigator 2 中的 SpiderMonkey 引擎)里,值在底层用 32 位标签表示。其中对象指针的最低位为 0,而 null 被表示为全零(即 0x00000000)。引擎检查类型时只看最低位,结果把 null 误判为对象。这个错误在 ECMAScript 标准制定时已被发现,但为了不破坏已有代码,标准沿用了该行为。
typeof 对 null 的处理是特例
typeof 操作符对其他原始类型(如 string、number、boolean、undefined、symbol、bigint)都返回对应小写字符串,唯独 null 是例外:
-
typeof null === "object"(固定返回) typeof undefined === "undefined"-
typeof [] === "object"(数组确实是对象) typeof {} === "object"
如何正确判断 null
不能依赖 typeof 区分 null 和普通对象。实际开发中应显式判断:
立即学习“Java免费学习笔记(深入)”;
- 用严格相等:
value === null - 结合类型和值判断:
value === null || typeof value === "object"(注意:这仍会把null和对象混在一起,需按需取舍) - 更安全的空值检查(如判断是否为有效对象):
value != null && typeof value === "object" && !Array.isArray(value)
现代替代方案更可靠
ES6+ 提供了更精确的类型识别方式:
-
Object.prototype.toString.call(null)返回"[object Null]" -
Object.prototype.toString.call([])返回"[object Array]" - 可封装成通用判断函数:
const getType = v => Object.prototype.toString.call(v).slice(8, -1).toLowerCase()
这个行为不会被修复,语言规范已明确将其定为“必须保持”的特性。理解它背后的原因,有助于写出更健壮的类型判断逻辑。


















