JavaScript中应优先使用===,因其不进行类型转换、行为可预测;==按抽象相等算法隐式转换,易致陷阱,仅在value == null等少数场景适用。

理解 JavaScript 中的 == 和 ===
严格相等(===)不转换,只判类型和值
它先看两边是不是同一类型。类型不同,直接返回 false,连值都不比。比如 null === undefined 是 false,因为 null 是 Null 类型,undefined 是 Undefined 类型;0 === false 也是 false,数字和布尔是不同类型。对于对象,哪怕内容一模一样,只要不是同一个引用,就一定不等,[] === [] 返回 false。
宽松相等(==)会走一套固定转换流程
它不是“随便转”,而是按 ECMAScript 规范定义的抽象相等算法一步步来:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 如果一边是
null,另一边是undefined,直接返回 true(这是唯一硬编码的特例) - 如果一边是对象(如数组、对象字面量),另一边是原始值(如字符串、数字),对象会先调用
valueOf(),失败再调用toString(),转成原始值后再继续比较 - 如果一边是布尔值,它会被转成数字:
true → 1,false → 0 - 如果一边是字符串,另一边是数字,字符串会用
ToNumber转换,失败得NaN,而NaN == 任何值都是 false - 其他组合(如
undefined == 0、null == 0)基本都转成数字比较,但注意null转数字是0,undefined转数字是NaN,所以null == 0是 false,undefined == 0也是 false
常见陷阱背后其实是可推导的规则
很多看似反直觉的结果,其实都能用上面的流程解释清楚:
立即学习“Java免费学习笔记(深入)”;
-
[] == false:空数组先toString()得'',再转数字得0;false转数字也是0→ true -
[1] == 1:数组[1]→'1'→1,和右边的1相等 → true -
{} == '[object Object]':对象默认toString()就是这个字符串 → true -
NaN == NaN:规范规定,NaN与任何值(包括自己)用==比都返回 false
实际开发中怎么用才稳妥
日常写代码,绝大多数场景应该无条件用 ===:
- 避免因隐式转换导致的意外结果,比如
'0' == false是 true,但语义上完全不等价 - 类型明确时,
===行为稳定、可预测,利于调试和维护 - 只有极少数情况需要
==,比如判断某个值是否为null或undefined,可以写value == null(等价于value === null || value === undefined)

















