javascript数值相等判断有三类陷阱:类型隐式转换(如"0"==false为true)、浮点数精度误差(0.1+0.2!==0.3)、特殊值行为(nan!==nan,+0===-0但object.is区分)。推荐统一用===,浮点比较用相对误差,检查有效数字用number.isfinite。

JavaScript 中 Number 类型数值在相等性判断里看似简单,实则暗藏三类典型陷阱:类型隐式转换带来的误判、浮点数精度导致的“明明相等却返回 false”、以及特殊值(NaN、+0/-0)违背直觉的行为。写业务逻辑时稍不留意,就会让条件分支失效或去重出错。
别信 ==,它会偷偷改你的数据类型
用 == 比较数字时,JS 会按规则把另一边转成数字再比——但这个“另一边”可能是字符串、布尔值甚至对象,结果常出人意料:
-
"0" == false→true(字符串转 0,false 转 0,0 == 0) -
document.getElementById("age").value == 0→ 可能把空输入""、字符串"0"、甚至"false"全当成 0 -
[0] == 0→true(数组先.toString()得"0",再转数字 0)
这类问题多出现在表单校验、API 响应解析等场景。推荐统一用 ===,需要宽松比较时,显式转换更可控:Number(str) === 0 或 parseInt(str, 10) === 0。
0.1 + 0.2 !== 0.3 是常态,不是 bug
二进制浮点表示无法精确存储大多数十进制小数,计算后残留微小误差:
-
0.1 + 0.2 === 0.3返回false(实际值是0.30000000000000004) -
Number.EPSILON(≈2.22e-16)不是全局容差,而是 1 附近的最小可分辨间隔 - 安全判断应使用相对误差:
Math.abs(a - b) - 对极小值(如
1e-17),建议补充固定容差:Math.abs(a - b)
NaN 和 +0/-0 是“特例中的特例”
它们让相等判断彻底脱离数学直觉:
-
NaN === NaN是false—— 所有涉及NaN的===或==都为 false -
+0 === -0是true,但Object.is(+0, -0)返回false,能区分二者 -
indexOf(NaN)永远找不到 NaN;switch(NaN)无法匹配任何 case - 检查是否为有效数字,优先用
Number.isFinite(value),而不是靠value === value(NaN 唯一不等于自身的值)
数值相等判断不复杂,但容易忽略细节。用 === 立住类型底线,用 Number.isFinite 和相对误差处理边界,再辅以 Object.is 应对 NaN/-0 场景,就能避开绝大多数坑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











