跳到主要内容

== 与 ===

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