== 和 === 有什么区别?
面试速答(30 秒版 TL;DR)
===:严格相等(Strict Equality),不做类型转换,类型不同直接false(除了NaN仍然不等于自身,+0与-0视为相等)。==:抽象相等(Abstract Equality),会做隐式类型转换,规则多且容易踩坑。- 建议:业务代码默认
===;只有在你明确需要某些历史兼容语义时才用==(比如x == null同时判断null/undefined)。
===:一句话讲清楚
- 类型不同:直接
false - 类型相同:
- 基本类型按值比(但
NaN !== NaN) - 对象按引用比(同一引用才相等)
- 基本类型按值比(但
1 === "1"; // false
NaN === NaN; // false
0 === -0; // true
({}) === ({}); // false
==:常考的几条规则(够用版)
规则 1:null 只和 undefined 相等
null == undefined; // true
null == 0; // false
规则 2:有 boolean 先转 number
true == 1; // true
false == 0; // true
规则 3:string 和 number 比较时,string 转 number
"42" == 42; // true
" " == 0; // true(" " -> 0)
规则 4:对象和原始值比较时,对象先 ToPrimitive
[] == 0; // true([] -> "" -> 0)
[] == ""; // true([] -> "")
==:类型转换比较规则具体怎么走?(规范版)
== 在规范里叫 抽象相等比较(Abstract Equality Comparison)。你可以把它当成一个“分支很多的算法”,只要按顺序套规则,就不会乱。
核心口诀(先背这个)
- 同类型:直接按严格相等比(行为基本等同
===:NaN不等于自身,+0等于-0)。 null/undefined:只有这俩彼此相等(null == undefined为true),和其他都不相等。- 遇到 boolean:先把 boolean 变成 number(
true -> 1,false -> 0)。 - 遇到对象(Object):对象先 ToPrimitive(
Symbol.toPrimitive/valueOf/toString),再继续比较。 - string 与 number:string 先转 number 再比。
- string 与 bigint:string 先“解析成 BigInt”,解析失败直接
false。 - number 与 bigint:需要 number 是“有限且整数”,才能和 bigint 比出相等。
(对象转原始值的细节见:对象转原始类型是根据什么流程运行的?)
按步骤(面试可口述)
下面是高频且最有用的一套“逐步检查顺序”(能覆盖你在题目里遇到的绝大多数情况):
- 类型相同:直接做严格相等比较。
null与undefined:任一边是null,另一边是undefined,返回true。number与string:把string做 ToNumber 后再比。bigint与string:把string解析为 BigInt 再比;解析失败直接false。- 有
boolean:把boolean做 ToNumber 后回到前面继续走(相当于把 boolean “消掉”)。 object与(string/number/bigint/symbol):把object做 ToPrimitive 后继续比。number与bigint:如果number是NaN/±Infinity返回false;如果number不是整数返回false;否则按数值相等比较。- 其他类型组合:返回
false(例如symbol == "x"、symbol == 1都是false)。
Mermaid:一眼看懂 == 的分支(面试推导用)
典型题 & 标准答法
Q1:为什么不推荐 ==?
面试口径:
- “因为它会触发隐式类型转换,规则复杂且有很多边界坑,导致可读性和可预测性变差;我默认用
===,需要转换就显式转换。”
Q2:什么时候可以用 ==?
常见的“可接受”场景:
if (x == null) {
// 同时匹配 null 和 undefined
}
解释口径:
- “这是一个约定俗成的写法,利用了
null == undefined为 true,而它们与其他值不相等。”
易错点
- 不要把
==的转换规则和Object.is混在一起:Object.is是另一套“同值相等”语义。 ==的坑通常来自“对象 ToPrimitive”和“boolean 转 number”,做题时先按这个顺序排查。