跳到主要内容

null 是对象吗?为什么 typeof null === "object"

面试速答(30 秒版 TL;DR)

  • null 不是对象,它是一个原始值(primitive),表示“空引用”。
  • typeof null === "object" 是 JS 早期实现遗留的历史 bug,为了兼容性一直保留至今。
  • 判断 nullx === null,不要用 typeof

关键事实:null 的行为不像对象

null === null; // true
null == undefined; // true

null && 1; // null
null || 1; // 1

null.x; // TypeError: Cannot read properties of null

如果 null 真是对象,访问属性不该直接抛错;现实中它会抛错,说明它并不是“可用的对象引用”。


为什么会出现 typeof null === "object"

你可以这么讲(面试口径足够用):

  • JS 最早期实现里用一组低层标记位区分类型。
  • null 的底层表示刚好被误判为“对象”的标记。
  • 这个错误在标准化之前就被大量代码依赖,修复会造成巨大破坏,所以作为兼容性 bug 永久保留。

工程上怎么正确判断?

function isPlainObject(x) {
return x !== null && typeof x === "object";
}

function isNull(x) {
return x === null;
}

对比:typeof x === "object" 永远要配 x !== null


典型题 & 标准答法

Q1:如何一句话解释 typeof null

null 不是对象,typeof null 返回 object 是历史遗留 bug,兼容性原因保留。”

Q2:为什么说 null 表示“空引用”?

  • 它常用来表达“这里将来会放对象引用,但现在为空”。
  • 例如:let timer = null; 表示“当前没有定时器引用”。

易错点/坑

  • typeof null 不能用于判断对象类型。
  • null 当成 {} 使用会直接抛错(常见于解构/链式访问)。
    • 更稳的写法:可用可选链 obj?.a?.b,以及空值合并 x ?? default

速记要点(可背诵)

  • null 是 primitive;typeof null 是兼容性 bug。
  • 判空:x === null;判对象:x !== null && typeof x === "object"