== 和 === 有什么区别?
面试速答(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”,做题时先按这个顺序排查。