null == 0 是 false,因为抽象相等算法中 null 只与 undefined 相等,不参与数字转换;而 number(null) 显式转为 0,二者规则不同。

JavaScript 中 null == 0 返回 false,这是由抽象相等(==)的类型转换规则决定的,不是直觉上的“空值等于零”。
为什么 null == 0 是 false
根据 ECMAScript 规范,== 在比较不同类型的值时会尝试类型转换。但 null 是个特例:
-
null只与undefined相等(null == undefined为 true) -
null与数字(包括0)、字符串、布尔值等其他类型比较时,不会被转成数字或任何其他原始值 - 所以
null == 0→ 不触发数字转换 → 直接判定为 false
null == 0 和 Number(null) 的区别
虽然 null == 0 是 false,但 Number(null) 却是 0。这看似矛盾,实则源于不同上下文的转换规则:
-
Number(null)是显式转换,规范明确要求:`null` 转为数字时返回 `+0` -
null == 0是抽象相等比较,走的是另一套宽松相等算法,其中null和undefined自成一组,不参与数值转换分支 - 换句话说:能转成 0 ≠ 在 == 中等于 0
安全比较 null 与 0 的推荐方式
避免依赖 == 的隐式行为,用更清晰、可预测的方式:
- 用严格相等
===:直接判断是否字面量相等(null === 0→ false,明确且无歧义) - 显式检查意图:比如想确认“值为 null 或数值为 0”,写成
value === null || value === 0 - 若需把 null 当作 0 处理(如计算场景),先做默认赋值:
const num = value ?? 0;,再比较num === 0 - 避免
==混合比较,尤其涉及null、0、''、false时极易出错
常见误判示例与解释
这些容易让人困惑的表达式及其真实结果:
-
null == undefined→ true(规范特例) -
null == false→ false(false会转为0,但null不转,故null == 0仍为 false) -
0 == ''→ true(空字符串转为数字是0) -
null == ''→ false(两者类型不同,且都不触发互相转换)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











