=== 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 | 特殊行为 |
---|---|---|---|---|
== | 是 | false | true | 复杂类型转换规则 |
=== | 否 | false | true | 无 |
Object.is | 否 | true | false | 无 |
使用建议
- 大多数情况下使用 ===:避免 == 的类型转换带来的意外行为
- 需要特殊 NaN 或 ±0 比较时使用 Object.is()
- 避免使用 ==:除非你明确需要类型转换并且了解所有转换规则
特殊案例
javascript
// 奇怪的 == 行为
[] == ![] // true
'' == false // true
'0' == false // true
// Object.is 的特殊情况
Object.is(NaN, NaN) // true
Object.is(0, -0) // false
记住这些比较运算符的差异可以帮助你避免 JavaScript 中一些常见的陷阱。