JS-一文搞懂== 与 ===(面试常考)

4 阅读2分钟

前言

在 JavaScript 中,==(等值比较)和 ===(全等比较)是初学者最容易混淆的概念。理解它们的底层转换逻辑,不仅能帮你避开逻辑陷阱,更是掌握 JS 隐式转换的关键。

一、 全等运算符 ===(严格比较)

=== 的规则非常直接:类型不同,直接返回 false

具体规则:

  1. 类型判断:如果类型不同,就不相等。

  2. 基本类型

    • 数值:值相同则相等。但注意 NaN === NaNfalse
    • 字符串/布尔值/Null/Undefined:值相同则相等。
  3. 引用类型

    • 对象/数组/函数:比较的是内存地址。即使内容完全一样,只要不是同一个引用,结果就是 false
    • [] === [] // false
    • {} === {} // false

二、 等值运算符 ==(隐式转换比较)

== 的规则比较复杂,它会先尝试进行类型转换,直到两边类型一致后再进行比较。

转换链路:

  1. 类型相同:直接进行 === 比较。

  2. Null 与 Undefined:它们两个互相相等,且不等于其他任何值。

    • null == undefined // true
  3. 字符串 vs 数值:将字符串转换为数值

  4. 布尔值 vs 其他:将布尔值转换为数值true \rightarrow 1, false \rightarrow 0)。

  5. 对象 vs 基本类型(数值/字符串/Symbol):

    • 将对象转换为基本类型(Primitive)。
    • 转换机制:优先调用 valueOf(),若返回的不是基本类型,再调用 toString()
    • 特例Date 对象会优先调用 toString()

代码实战:验证对象的转换

JavaScript

const obj = {
  a: 1,
  valueOf: () => {
    return obj.a + 1; // 返回 2
  },
  toString: () => {
    return 'str';
  }
}

console.log(obj == 2);     // true (优先执行 valueOf)
console.log(obj == 'str'); // false (由于 valueOf 返回了 2,比较变为 2 == 'str',结果为 false)

三、 特殊值:NaN 的处理

NaN(Not a Number)是 JS 中的异类,它不等于任何值,包括它自己。

  • NaN == NaN // false
  • NaN === NaN // false

避坑指南:判断一个变量是否为 NaN,在 ES6 之后建议使用 Number.isNaN() ,它比全局的 isNaN() 更加严格准确。


四、 总结与对比表

比较情况== (等值)=== (全等)
类型不同先尝试转换类型再比较直接返回 false
null 与 undefinedtruefalse
NaN 比较falsefalse
不同引用的空数组 []falsefalse

五、 最佳实践建议

在大多数企业级大厂的开发规范中,建议:

  1. 永远优先使用 ===:这能避免很多难以排查的隐式转换 Bug。

  2. 特殊场景用 ==:唯一的例外通常是判断一个值是否为 null 或 undefined。

    // 这一行代码等同于 if (obj === null || obj === undefined)
    if (obj == null) { 
      // ... 
    }