null 是对象吗?为什么 typeof null === "object"?
面试速答(30 秒版 TL;DR)
null不是对象,它是一个原始值(primitive),表示“空引用”。typeof null === "object"是 JS 早期实现遗留的历史 bug,为了兼容性一直保留至今。- 判断
null用x === 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"。