js 中 == 和 === 的区别

220 阅读4分钟

在JavaScript里,==是松散相等运算符,而===是严格相等运算符。它们的区别主要在于类型转换的处理上。==会在比较之前进行类型转换,而===不会,它要求值和类型都相同才会返回true。

1. 类型转换规则

  • ==:比较前会尝试将两侧值转换为相同类型。
  • ===:直接比较值和类型,不进行类型转换

2. 具体场景对比

场景==结果=== 结果原因
5 == "5"truefalse==将字符串 "5"转为数字 5
0 == falsetruefalse==false 转为 0
"" == 0truefalse==将空字符串 ""转为 0
null == undefinedtruefalse== 认为两者都是“空值”,但类型不同
NaN == NaNfalsefalseNaN与任何值(包括自身)都不相等
[] == 0truefalse==将空数组 []转为 0
![] == falsetruetrue[] 在布尔上下文中会被转换为 true,因为非空对象都是真值
[] == falsetruefalse比较对象和原始值时,对象会被转换为原始值。数组的原始值转换会调用 valueOf()toString() 方法。空数组 []toString() 返回空字符串 "",而空字符串在布尔上下文中会被转换为 false
{} == truefalsefalse对象与原始类型比较时,对象转为原始值(如 [object Object]),但无法匹配 true
new String("5") == "5"truefalse==将对象转为原始字符串 "5",但类型不同

3. ==运算符的隐式类型转换规则总结

以下是 JavaScript 中 ==运算符的隐式类型转换规则的二维比较表格,涵盖常见数据类型的组合:

左侧类型右侧类型转换规则/结果示例
数字字符串字符串尝试转为数字,失败则转为 NaN5 == "5" → true
数字布尔值布尔值转为数字(true → 1, false → 01 == true → true
数字对象对象通过 valueOf()toString()转为原始值5 == [] → false[] → "" → 00 ≠ 5
数字nullnull转为 00 == null → false(类型不同)
数字undefinedundefined转为 NaN5 == undefined → false
数字NaNNaN不等于任何值(包括自身)NaN == NaN → false
字符串数字字符串尝试转为数字,失败则转为 NaN"123" == 123 → true
字符串布尔值布尔值转为数字,字符串尝试转为数字"0" == false → true
字符串对象对象转为原始值,字符串尝试转为数字"5" == [] → false[] → "" → 0"5" → 5
字符串nullnull转为 0,字符串尝试转为数字"0" == null → false
字符串undefinedundefined转为 NaN,字符串尝试转为数字"abc" == undefined → false
布尔值数字布尔值转为数字(true → 1, false → 0true == 1 → true
布尔值字符串布尔值转为数字,字符串尝试转为数字false == "0" → true
布尔值对象对象转为原始值,布尔值转为数字true == [] → false[] → "" → 0true → 1
布尔值nullnull转为 0,布尔值转为数字false == null → false
布尔值undefinedundefined转为 NaN,布尔值转为数字true == undefined → false
对象数字对象转为原始值,数字不变[] == 0 → true[] → "" → 0
对象字符串对象转为原始值,字符串尝试转为数字[] == "0" → true
对象布尔值对象转为原始值,布尔值转为数字{} == false → false
对象null对象转为原始值,null转为 0[0] == null → false
对象undefined对象转为原始值,undefined转为 NaN[] == undefined → false
null数字null转为 0null == 0 → false(类型不同)
null字符串null转为 0,字符串尝试转为数字null == "0" → false
null布尔值null转为 0,布尔值转为数字null == false → false
null对象null转为 0,对象转为原始值null == [] → false
nullundefinednull == undefined → true(特殊规则)null == undefined → true
undefined数字undefined转为 NaNundefined == 5 → false
undefined字符串undefined转为 NaN,字符串尝试转为数字undefined == "abc" → false
undefined布尔值undefined转为 NaN,布尔值转为数字undefined == true → false
undefined对象undefined转为 NaN,对象转为原始值undefined == {} → false
undefinednullundefined == null → true(特殊规则)undefined == null → true
NaN任何值NaN不等于任何值(包括自身)NaN == NaN → false
  1. 对象与原始值比较
    对象通过 valueOf()toString() 转为原始值(如 [] → ""),再与右侧比较。

  2. 布尔值转换
    布尔值在比较时始终转为数字(true → 1, false → 0)。

  3. 字符串与数字比较
    字符串尝试解析为数字,失败时转为 NaN

  4. 特殊值规则

    • NaN 与任何值(包括自身)比较均为 false
    • nullundefined 仅互相相等。
  5. 类型不同时的比较
    若转换后值相等但类型不同(如 0 == "0"),结果为 true;若值不等(如 0 == "abc"),结果为 false

4. 使用推荐

  • 优先使用 ****===:避免隐式类型转换导致的意外结果(如 0 == ""true)。
  • 谨慎使用 ==:仅在明确需要类型转换时使用(如检查 nullundefinedvalue == null 等价于 value === null || value === undefined)。