跳到主要内容

===== 有什么区别?

面试速答(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([] -> "")

典型题 & 标准答法

Q1:为什么不推荐 ==

面试口径:

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

Q2:什么时候可以用 ==

常见的“可接受”场景:

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

解释口径:

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

易错点

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