typeof null返回"object"是ecmascript规范保留的历史行为,并非bug;其根源是1995年底层全零指针被误判为对象类型标签000,为兼容性永久固化;正确检测应使用value === null。

这不是一个 Bug,而是 JavaScript 早期设计时的实现限制,无法“排查”或“修复”,但可以主动规避。
理解问题本质:null 的 typeof 是 "object" 是规范行为
在 JavaScript 最初的实现中(Netscape Navigator 2),值被存储为带有类型标签的单元。null 被表示为全零的机器码指针,而当时的类型判断逻辑把全零指针统一归类为 object 类型。ECMAScript 规范后来保留了这一行为以保证向后兼容,所以 typeof null === "object" 是符合标准的、有意为之的结果,不是运行时错误或逻辑缺陷。
检测 null 的正确方式:用严格相等(===)或 Object.is()
不要依赖 typeof 区分 null 和普通对象。应优先使用:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
value === null—— 最直接、高效、语义清晰 -
Object.is(value, null)—— 更严谨(能区分+0和-0,但对 null 与===效果一致) - 避免
value == null(会同时匹配undefined,虽常用但隐含类型转换,语义不如明确判断)
安全判断“是否为真实对象”的通用模式
若你真正想判断的是“是否为非 null 的普通对象(即 plain object)”,可组合检查:
value !== null && typeof value === "object" && !Array.isArray(value)- 更健壮的写法(排除函数、日期、正则等):
value !== null && typeof value === "object" && value.constructor === Object - 或使用
Object.prototype.toString.call(value) === "[object Object]"
工具层防护:TypeScript 或 ESLint 可提前预警
静态类型系统能显著降低误用风险:
- TypeScript 中,
typeof x类型收窄后不会把null纳入"object"分支;且strictNullChecks开启后,null和undefined是独立类型,强制显式处理 - ESLint 规则如
no-implicit-coercion或自定义规则可提醒避免仅靠typeof做空值判断
不复杂但容易忽略:把 null 当作特殊值单独对待,而不是试图把它塞进 typeof 的分类体系里。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










