JS 中的 == 与 ===

732 阅读1分钟

=== 严格运算符:类型不同就不相等

  1. 如果类型不同,就[不相等]
  2. 如果两个都是数值,并且是同一个值,那么[相等];如果其中至少一个是 NaN,那么[不相等]。(判断一个值是否是 NaN,只能用 isNaN() 来判断)
  3. 如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
  4. 如果两个值都是 true,或者都是 false,那么[相等]。
  5. 如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
  6. 如果两个值都是 null,或者都是 undefined,那么[相等]。

== 相等运算符

  1. 如果两个值类型相同,进行 === 比较。
  2. 如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
  • 2.1 如果一个是 null、一个是 undefined,那么[相等]。
null == undefined //true
  • 2.2 如果任一值是字符串,另一个值是数值,在比较相等性之前先将字符串转换为数值;即是调用 Number() 函数。
  • 2.3 如果任一值时布尔值,则在比较相等性之前先将其转换为数值,即是调用 Number() 函数。
  • 2.4 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的 toString 或者 valueOf 方法。 js 核心内置类,会尝试 valueOf 先于 toString;例外的是 Date,Date 利用的是 toString 转换。

[]==[] []!==[] 问题

[]==[] //false
  • 都是引用类型,地址不同
[]==![] //true
  1. 首先计算![],对空数组转布尔类型,得到 false,此时为 []==false
  2. 对应2.3,布尔类型转数值,得到0,此时为[]==0
  3. 对应2.4,[].valueOf(),得到[]本身,[].toString(),得到" "
  4. 对应2.2,Number(" ")=0
  5. 比较 0==0,结果为 true