== 会进行隐式类型转换,=== 不转换类型且要求值与类型均相同;如 "5" == 5 为 true,但 "5" === 5 为 false,NaN === NaN 也为 false。

JavaScript 中 ==(相等)和 ===(全等)在数值比较时行为不同,核心区别在于是否进行**隐式类型转换**。理解它们的转换规则,是避免意外结果的关键。
相等(==)会触发类型转换,数值比较常“绕弯子”
== 在比较前会尝试把两个操作数转为相同类型,再比较值。对数值相关场景,主要遵循以下路径:
- 如果一边是数字,另一边是字符串:字符串会被
Number()转换(如"123" == 123→123 == 123→true) - 如果一边是布尔值:
true变1,false变0(如0 == false→0 == 0→true) - 如果一边是
null或undefined:它们只彼此相等(null == undefined是true),但和数字比较都为false(如null == 0→false) - 对象(如
new Number(5))与原始数值比较时,先调用.valueOf()或.toString()尝试转原始值
全等(===)不转换类型,数值必须“原装匹配”
=== 要求**值相等且类型相同**。只要类型不同,直接返回 false,完全跳过转换逻辑:
-
5 === "5"→false(number vs string) -
0 === false→false(number vs boolean) -
0 === 0→true(同为 number,值相同) -
NaN === NaN→false(特殊规则:NaN 不等于任何值,包括自己)
数值比较中的典型陷阱与建议
这些坑往往出现在表单输入、API 返回或条件判断中:
立即学习“Java免费学习笔记(深入)”;
-
"0" == false是true(字符串转 0,再与 false 转 0 比较),但直觉上容易误判 -
document.getElementById("input").value总是字符串,若用== 0判断空值或零,可能把""、"0"、"false"全混为一谈 - 推荐默认使用
===;需要宽松比较时,显式转换更安全,例如:Number(str) === 0或parseInt(str, 10) === 0 - 检查是否为有效数字,优先用
Number.isFinite(value),而不是依赖==或===的副作用
全等不折腾类型,相等爱“猜心思”。写数值逻辑时,少依赖隐式转换,多靠显式处理,代码更可读也更可靠。










