Skip to content

== 和 === 运算符的区别

相等操作符 (==)

  • == 运算符会进行类型转换,然后再比较操作数的值是否相等。

  • 它会根据以下规则进行隐式类型转换:

    • 布尔值转换为数值true 转换为 1false 转换为 0
    js
    let result1 = (true == 1); // true
    • 字符串转换为数值:字符串会转换为对应的数值,再进行比较。
    js
    let result1 = ("55" == 55); // true
    • 对象转换为原始值:通过调用对象的 valueOf() 方法获取其原始值,再进行比较。
    js
    let obj = {valueOf:function(){return 1}};
    let result1 = (obj == 1); // true
    • nullundefined 相等
    js
    let result1 = (null == undefined); // true
    • 如果有操作数为 NaN,则相等操作符返回 false
    js
    let result1 = (NaN == NaN); // false
    • 对象之间比较引用:比较两个对象是否引用同一个内存地址。
    js
    let obj1 = {name: "xxx"};
    let obj2 = {name: "xxx"};
    let result1 = (obj1 == obj2); // false

全等操作符 (===)

  • === 运算符不会进行类型转换,只有两个操作数的类型和值都相同,才会返回 true

  • 它直接比较操作数的类型和值:

    • 类型和值都相同时,返回 true

      let result1 = (55 === 55); // true
    • 类型不同即使值相同,返回 false

      let result1 = ("55" === 55); // false
    • undefinednull 与自身严格相等

      let result1 = (null === null);  // true
      let result2 = (undefined === undefined);  // true

总结

  • 类型转换== 会进行类型转换后再比较,而 === 不会进行类型转换。
  • 精确性=== 更加精确,避免了类型转换带来的不确定性。
  • nullundefined== 认为 nullundefined 相等,而 === 不认为它们相等。