typeof null 返回 "object" 是历史遗留 bug,源于1995年javascript初版的实现错误,因向后兼容无法修复;检测 null 应使用 value === null。

直接说结论:typeof 在 JavaScript 中对 null 返回 "object" 是历史遗留 bug,不是设计意图,也无法修复——因为会破坏大量现有代码。
为什么 typeof null 是 "object"
这是 V8 引擎(以及所有主流 JS 引擎)沿用的早期实现缺陷。1995 年 Netscape 的第一版 JavaScript 中,null 被错误地归类为对象类型,底层将其表示为全零的机器码,而当时类型判断逻辑恰好把全零当成了对象指针。ECMAScript 标准后来选择保留它,以保证向后兼容。
这不是语言特性,也不是“有意为之的抽象”,就是个不能动的 bug。
检测 null 的正确方式是 value === null
依赖 typeof 判断 null 必然出错。唯一可靠、无歧义的方式是严格相等:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
if (value === null) { /* 处理 null */ }
其他常见误用包括:
-
!value:会把0、""、false、undefined全部混为“falsy”,不等于null -
typeof value === "object":漏掉null,且把数组、正则、日期都算进来 -
value == null:虽能匹配null和undefined,但属于隐式转换,语义模糊,不推荐在明确只关心null时使用
需要同时区分 null 和 undefined?用 Object.is()
当逻辑上必须分开处理两者时(比如 API 明确要求字段可为 null 但不可为 undefined),=== 已足够;但若想封装一个健壮的工具函数,Object.is() 更安全:
function isNull(value) {<br> return Object.is(value, null);<br>}
它和 === 行为一致,但显式表达了“值恒等”的语义,且能正确处理 NaN 等边界情况——不过对 null 来说,=== 和 Object.is() 效果完全一样。
真正容易被忽略的是:很多人写防御性代码时,习惯先 typeof 再分支,结果在 null 上栽跟头。只要记住一点——null 是唯一一个 typeof 返回 "object" 却不是对象的值,其余所有对象(包括 Array、Date、RegExp)都符合直觉。










