请解释 JavaScript 中 == 操作符在进行比较时执行强制类型转换的具体规则,包括不同类型之间的转换流程和需要特别留意的边界情况。
考察说明
考察对 JavaScript 抽象相等比较算法及类型转换细节的掌握程度。
回答思路
- 【回答框架 1】== 比较时若左右类型相同,则直接按值比较(对象比较引用);若类型不同,会先进行强制类型转换再比较,核心规则依据 ECMAScript 的 Abstract Equality Comparison。
- 【回答框架 2】当一侧为 null 或 undefined 时,另一侧必须也是 null 或 undefined 才相等,null == undefined 为 true,但 null == 0 或 undefined == 0 均为 false。
- 【回答框架 3】当比较数字和字符串时,字符串会被转换为数字,例如 '5' == 5 为 true,转换失败则得到 NaN,比较结果为 false。
- 【回答框架 4】当比较布尔值时,布尔值会先被转换为数字,true 转为 1,false 转为 0,再与另一侧进行比较,例如 true == 1 为 true。
- 【回答框架 5】当对象与原始值比较时,对象会通过 ToPrimitive 转换(通常先调用 valueOf 再调用 toString),得到原始值后再按上述规则比较,例如 [] == 0 为 true。
- 【关键点 1】null 和 undefined 相互相等,但与其他值均不相等。
- 【关键点 2】字符串与数字比较时字符串转为数字,布尔值先转数字。
- 【关键点 3】对象与原始值比较时,对象先 ToPrimitive 转换。
- 【关键点 4】NaN 不与任何值相等,包括自身。
- 【关键点 5】建议用 === 避免隐式转换风险。
- 【易错点 1】忽略 null 与 0 不相等这一特例,导致错误判断。
- 【易错点 2】误以为对象转原始值时总是调用 toString,实际优先调用 valueOf。
- 【易错点 3】将 == 与 === 混用,未意识到类型转换带来的数据风险。