核心区别在于是否执行类型转换:== 先尝试把两边转成同一类型再比较值,=== 要求类型和值都完全一致,类型不同直接返回 false。

== 会隐式转换类型
它按固定规则把不同类型“拉平”后再比,比如:
- 字符串遇到数字,自动调用 Number() 转换(
'123' == 123→ true) - 布尔值遇到其他类型,true 变 1,false 变 0(
false == 0→ true) - 空数组
[]和false、0、''都可能相等([] == false→ true) -
null == undefined是唯一特例,返回 true;但它们跟数字或字符串比都是 false
=== 不做任何转换
它先看类型,类型不对就立刻结束:
-
5 === '5'→ false(number vs string) -
true === 1→ false(boolean vs number) -
null === undefined→ false(类型不同) -
NaN === NaN→ false(这是唯一值不等于自身的例外) - 两个对象即使内容一样,只要不是同一引用,
===就是 false
实际开发中该用哪个
绝大多数场景推荐用 ===:
- 避免意外结果,比如
0 == ''或0 == []返回 true,容易埋下 bug - 代码意图更明确:你真想比较“值和类型都一样”,而不是“我猜它们大概等价”
- 现代工具链(如 ESLint)默认警告 == 的使用
- 只有极少数情况需用 ==,比如明确要兼容
null和undefined(但更推荐用val == null这种写法)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











