== 比较遵循三条主线:同类型直接比较;不同类型优先转数字(null/undefined除外);对象先转原始值再比较;null与undefined仅彼此相等。

记住 == 的隐式转换规则,关键不是死背表格,而是抓住三条主线:**优先级顺序、原始值归一化、特殊对等关系**。下面用清晰、可操作的方式帮你建立直觉记忆。
一、先看类型是否相同——同类型直接按 === 比
这是最简单也最容易忽略的前提:
- 如果左右两边类型一致(比如都是 string、都是 number、都是 null),
==就不转换,直接比值 -
null == null→ true,"abc" == "abc"→ true,false == false→ true - 这个阶段没有陷阱,和
===行为完全一样
二、遇到不同类型,统一转成数字再比(除 null/undefined 外)
绝大多数非同类型的 == 比较,底层逻辑是:**先尽量转成 number,再比较**。记住这个“数字中心思想”:
-
boolean→number:true → 1,false → 0 -
string→number:只含数字的字符串成功转换("123" → 123),空字符串"" → 0,无效字符串如"abc" → NaN -
null → 0?❌ 错!null不转成 0;它只和undefined相等,和其他任何值(包括 0、false、"")都 false -
undefined同理,只和null相等,其余全 false - 所以
0 == false→ true(0 == 0),"0" == false→ true(0 == 0),但0 == null→ false,"" == null→ false
三、对象参与比较时,先变成原始值再走上面两步
只要一边是对象(Array、Object、Date、Function 等),就会触发 ToPrimitive 流程:
立即学习“Java免费学习笔记(深入)”;
- 先调
valueOf(),如果返回的是原始值(string/number/boolean),就用它 - 否则调
toString(),用它的返回值(通常是字符串) - 最后拿这个原始值,回到前面“同类型比”或“转数字比”的逻辑
- 例子:
[] == false→[]转成""→"" == false→0 == 0→ true - 再如:
[1] == 1→[1].toString() → "1"→"1" == 1→1 == 1→ true
四、唯一特例:null 和 undefined 是一对“绑定情侣”
这条单独记,不参与数字转换,也不受其他规则干扰:
-
null == undefined→ true(仅此一对) -
null == 0、null == false、null == ""→ 全是 false -
undefined == 0、undefined == false、undefined == ""→ 全是 false
真正管用的记忆法:遇到 ==,心里默念三句话——同型不转,异型转数,对象先简,null/undefined 只认彼此。多写几个典型例子手敲验证几次(比如 [] == ![]、{} == {}、"0" == false),比背表更牢靠。


















