Skip to content

=== vs == vs Object.is()

1. 严格相等 (===)

特点

  • 不进行类型转换
  • 比较值和类型
  • NaN 不等于 NaN
  • +0 等于 -0

示例

javascript
1 === 1     // true
1 === '1'   // false
NaN === NaN // false
+0 === -0   // true

2. 宽松相等 (==)

特点

  • 会进行类型转换(强制类型转换)
  • 遵循复杂的比较规则
  • 可能导致一些不直观的结果

示例

javascript
1 == 1     // true
1 == '1'   // true
'' == 0    // true
null == undefined // true

3. Object.is()

特点

  • 类似于 ===,但有两个例外:
    • NaN 等于 NaN
    • +0 不等于 -0
  • 不进行类型转换

示例

javascript
Object.is(1, 1)     // true
Object.is(1, '1')   // false
Object.is(NaN, NaN) // true
Object.is(+0, -0)   // false

比较表

比较方式类型转换NaN === NaN+0 === -0特殊行为
==falsetrue复杂类型转换规则
===falsetrue
Object.istruefalse

使用建议

  1. 大多数情况下使用 ===:避免 == 的类型转换带来的意外行为
  2. 需要特殊 NaN 或 ±0 比较时使用 Object.is()
  3. 避免使用 ==:除非你明确需要类型转换并且了解所有转换规则

特殊案例

javascript
// 奇怪的 == 行为
[] == ![]      // true
'' == false    // true
'0' == false   // true

// Object.is 的特殊情况
Object.is(NaN, NaN)  // true
Object.is(0, -0)     // false

记住这些比较运算符的差异可以帮助你避免 JavaScript 中一些常见的陷阱。