JavaScript数字比较需兼顾类型、精度、特殊值和上下文;优先用===但须辅以容差判断浮点数、单独处理NaN/+0/-0等特殊值,并用Number.isFinite()预检再做大小比较。

JavaScript 中 Number 类型的比较不能只看“值是否相等”,必须同时考虑类型、精度、特殊值和上下文。直接用 == 或 === 判断,很容易掉进隐式转换或浮点误差的坑里。
优先用 ===,但别让它单独扛所有责任
全等运算符 === 不做类型转换,能避免字符串 "0"、布尔 false、空数组 [] 等被悄悄转成 0 导致误判。但它对浮点数和特殊值依然不可靠:
-
0.1 + 0.2 === 0.3返回false(实际是0.30000000000000004) -
NaN === NaN返回false -
+0 === -0返回true(但数学上二者有区别)
所以 === 是良好起点,但不是终点——它适合整数、明确来源的数字、以及类型已知的场景。
浮点数比较必须用容差,而不是相等
二进制浮点表示决定了 0.1 + 0.2 !== 0.3 是必然结果,不是 bug。正确做法是用差值是否足够小来判断“近似相等”:
- 简单通用:
Math.abs(a - b) (适用于大多数业务场景) - 更健壮(相对误差):
Math.abs(a - b) - 金融类计算建议绕过浮点:统一转为“分”(整数)再比,例如
centsA === centsB
特殊值要单独处理,不能一概而论
NaN、Infinity、-Infinity、+0、-0 都有反直觉行为:
- 检测
NaN:只用Number.isNaN(x),不用x === NaN或isNaN(x)(后者会把{}也判为NaN) - 区分
+0和-0:用Object.is(+0, -0)返回false;===则返回true - 检查是否为普通有效数字:用
Number.isFinite(x),它排除NaN、Infinity和-Infinity
关系运算(>、NaN
>、、>=、 会尝试将操作数转为数字再比较,规则清晰:
-
"42" > 41→42 > 41→true -
"abc" > 1→NaN > 1→false(任何与NaN的大小比较都返回false) -
Infinity > 999999999→true;-Infinity →true
因此,做大小判断前,可先用 Number.isFinite() 排除异常值,再放心比较。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











