#4 == 和 === 的区别

预计阅读时间: 3 分钟

JavaScript 提供三种不同的值比较运算:

  • === 严格相等(三个等号)
  • == 宽松相等(两个等号)
  • Object.is()

==叫做相等运算符,===叫做严格运算符。

规则

  1. ==:先隐式类型转换,再判断值是否相等

  2. ===:直接判断 类型 + 值 是否相等

  3. ==表示只要值相等即可为真,而===则要求不仅值相等,而且也要求类型相同。

==

5 == '5'                          // true,因为字符串 '5' 被转换为数字 5
'' == '0'                         // false
0 == ''                           // true
0 == '0'                          // true
false == 'false'                  // false
false == '0'                      // true
false == undefined                // false
false == null                     // false
null == undefined                 // true
' \t\r\n ' == 0                   // true

嗯,很奇妙的==,给我带来了一些反直觉的结果

===

console.log(1 === "1");           //false, 类型不同
console.log(true === 1);          //false, 类型不同
console.log(null === undefined);  // false,因为类型不同

nice,和符合我们直觉的结果

所以说:一般推荐在 JavaScript 中优先使用 ===,以避免潜在的错误,而且很符合我们的直觉何乐而不为呢?

补充 Object.is()

Object.is()

Object.is() 是一个用于比较两个值是否相同的方法,它在某些情况下比 === 更准确。以下是 Object.is() 的主要特点和用法:

Object.is(value1, value2);

特点:

  1. 类型和值完全相等:Object.is() 会考虑值的类型,并且只有在两个值相等时才返回 true。
  2. 特殊情况
  • NaN被视为相等
    console.log(Object.is(NaN, NaN)) // true 注意: === 是false
  • +0-0被视为不想等
    console.log(Object.is(+0, -0)); //false 注意: === 是相等

=== 的比较 Object.is() 更严格,它处理一些 === 不处理的特殊情况。 对于一般的比较,=== 更加常用,但在需要处理 NaN 和 +0/-0 的情况下,Object.is() 更加可靠。

当需要精确比较对象、数组或者处理特殊值时,使用 Object.is() 是一个很好的选择。

总的来说,Object.is() 提供了一种更精确的方式来比较值,特别是在处理 JavaScript 中的一些特殊情况时。

参考:

相等比较和相同 MDN