== 与 ===
JavaScript 中的两种相等比较运算符。
区别
| 运算符 | 名称 | 类型转换 |
|---|---|---|
== | 宽松相等 | 会进行类型转换 |
=== | 严格相等 | 不进行类型转换 |
== 宽松相等
使用 == 时,如果类型不同,JavaScript 会尝试进行类型转换后再比较。
// 常见陷阱
0 == '0' // true - 字符串转数字
'' == 0 // true - 空字符串转 0
false == 0 // true - false 转 0
null == undefined // true - 特殊规则
[] == 0 // true - 空数组转 0
[] == ![] // true - 复杂转换
转换规则
// 字符串转数字
'123' == 123 // true
'abc' == NaN // false (NaN 不等于任何值)
// 布尔转数字
true == 1 // true
false == 0 // true
// 对象转原始值
[1] == 1 // true - [1] 转 '1' 再转 1
[1,2] == '1,2' // true
{} == '[object Object]' // true
=== 严格相等
使用 === 时,类型不同直接返回 false,不会进行转换。
// 推荐用法
0 === '0' // false - 类型不同
'' === 0 // false
false === 0 // false
null === undefined // false
[] === 0 // false
特殊值比较
// NaN 比较
NaN == NaN // false
NaN === NaN // false
// 使用 Number.isNaN() 或 Object.is()
// Object.is() - 更严格的比较
Object.is(NaN, NaN) // true
Object.is(0, -0) // false (区分 +0 和 -0)
Object.is(+0, -0) // false
// null 和 undefined
null == undefined // true (特殊规则)
null === undefined // false
最佳实践
// ✅ 推荐:始终使用 ===
if (value === 0) { }
if (value === '') { }
if (value === null) { }
if (value === undefined) { }
// ❌ 避免:使用 ==
if (value == 0) { } // 可能匹配 false, '', []
if (value == '') { } // 可能匹配 0, null, undefined
// ✅ 检查 null 或 undefined
if (value == null) { } // 同时检查 null 和 undefined
// ✅ 检查 falsy 值
if (!value) { } // 检查 0, '', false, null, undefined, NaN
常见坑
// 坑 1: 空数组
[] == false // true
[] == ![] // true
// 坑 2: 字符串和数字
'5' == 5 // true
'5' === 5 // false
// 坑 3: 布尔值
true == 1 // true
false == '' // true
// 坑 4: null 和 undefined
null == undefined // true
null === undefined // false
null == 0 // false
// 坑 5: 对象
new String('5') == 5 // true
new String('5') === 5 // false
总结
- 始终使用
===,除非你明确需要类型转换 ==的转换规则复杂,容易出错- 使用
Object.is()处理 NaN 和 0 的特殊情况 - 使用
value == null同时检查 null 和 undefined