跳到主要内容

===== 有什么区别?

面试速答(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 == undefinedtrue),和其他都不相等。
  • 遇到 boolean:先把 boolean 变成 number(true -> 1false -> 0)。
  • 遇到对象(Object):对象先 ToPrimitiveSymbol.toPrimitive / valueOf / toString),再继续比较。
  • string 与 number:string 先转 number 再比。
  • string 与 bigint:string 先“解析成 BigInt”,解析失败直接 false
  • number 与 bigint:需要 number 是“有限且整数”,才能和 bigint 比出相等。

(对象转原始值的细节见:对象转原始类型是根据什么流程运行的?

按步骤(面试可口述)

下面是高频且最有用的一套“逐步检查顺序”(能覆盖你在题目里遇到的绝大多数情况):

  1. 类型相同:直接做严格相等比较。
  2. nullundefined:任一边是 null,另一边是 undefined,返回 true
  3. numberstring:把 string 做 ToNumber 后再比。
  4. bigintstring:把 string 解析为 BigInt 再比;解析失败直接 false
  5. boolean:把 boolean 做 ToNumber 后回到前面继续走(相当于把 boolean “消掉”)。
  6. object 与(string/number/bigint/symbol:把 object 做 ToPrimitive 后继续比。
  7. numberbigint:如果 numberNaN/±Infinity 返回 false;如果 number 不是整数返回 false;否则按数值相等比较。
  8. 其他类型组合:返回 false(例如 symbol == "x"symbol == 1 都是 false)。

Mermaid:一眼看懂 == 的分支(面试推导用)

典型题 & 标准答法

Q1:为什么不推荐 ==

面试口径:

  • “因为它会触发隐式类型转换,规则复杂且有很多边界坑,导致可读性和可预测性变差;我默认用 ===,需要转换就显式转换。”

Q2:什么时候可以用 ==

常见的“可接受”场景:

if (x == null) {
// 同时匹配 null 和 undefined
}

解释口径:

  • “这是一个约定俗成的写法,利用了 null == undefined 为 true,而它们与其他值不相等。”

易错点

  • 不要把 == 的转换规则和 Object.is 混在一起:Object.is 是另一套“同值相等”语义。
  • == 的坑通常来自“对象 ToPrimitive”和“boolean 转 number”,做题时先按这个顺序排查。