双等号(==)会进行隐式类型转换,null == undefined 为 true,但 null == 0、undefined == false 等均返回 false;全等号(===)严格比较类型和值,null === undefined 为 false,是判断二者的可靠方式。

比较运算符是区分 null 和 undefined 的关键工具,但它们的行为差异容易引发误判——核心在于“类型转换”是否发生。
双等号(==)会做隐式类型转换
使用 == 时,JavaScript 会先尝试把两边转成相同类型再比较:
-
null == undefined返回 true —— 这是规范明确规定的特例,二者被设计为“宽松相等” -
null == 0返回 false ——null转数字是0,但undefined == 0是false,而null不会因此和0相等 -
undefined == false返回 false;null == false也返回 false —— 它们都不会被转成布尔值参与比较
全等号(===)严格比较类型和值
=== 不做任何转换,直接判断类型与值是否完全一致:
-
null === undefined返回 false —— 因为typeof null是"object",typeof undefined是"undefined" -
null === null和undefined === undefined都返回 true - 这是判断二者最可靠的方式,也是现代代码中推荐的写法
其他常见比较操作的表现
除了 == 和 ===,还有几个容易忽略但实用的点:
立即学习“Java免费学习笔记(深入)”;
-
!null和!undefined都是 true —— 在if条件中二者都会被当作“假值”,无法靠取反区分 -
Number(null)是0,Number(undefined)是NaN—— 所以null * 2 === 0,而undefined * 2是NaN -
String(null)是"null",String(undefined)是"undefined"—— 类型转换结果完全不同
实际判断建议
日常开发中,不要依赖 == 做空值判断,尤其在类型不确定时:
- 想确认变量是否为
null:用value === null - 想确认变量是否为
undefined:用value === undefined或更安全的typeof value === "undefined"(避免全局undefined被重定义) - 想同时排除
null和undefined:用value != null(利用!=的宽松规则,它等价于!(value == null),而null == undefined为true,所以value != null可覆盖两者)


















