JavaScript 中 == 与 === 的区别

基本情况

== 表示等同比较,=== 表示恒等比较。

==:两边值类型不同的时候,要先进行类型转换,再比较。

===:不做类型转换,类型不同的一定不等。

详细说明

先说 ==

我在JavaScript 数据类型一文中最后关于“自动类型转换”时已经有说明,== 的比较主要是根据以下规则进行的:

  • 如果两个值类型相同,则进行 ===(恒等)比较。
  • 如果两个值类型不同,但他们可能相等。根据下面规则进行自动类型转换再比较:
    • 如果一个是 null、一个是 undefined,那么相等。
    • 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
    • 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
    • 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的 valueOf() 或者 toString() 方法(对象没有 valueOf() 方法则使用 toString() 方法转换)。JavaScript 核心内置对象,会尝试valueOf()先于toString()。
    • NaN 与任何操作数都不相等。
  • 任何其他组合,都不相等。

举例:

1
alert("1" == true); // true

类型不同,true 会先转换成数值 1,现在变成 “1” == 1,再把”1”转换成 1,比较 1 == 1, 相等。

再说 ===

下面的规则用来判断两个值是否 ===(恒等):

  • 如果类型不同,则不相等。
  • 如果两个都是数值,并且是同一个值,则相等;如果其中一个是 NaN,那么不相等。(判断一个值是否是 NaN,可以使用 isNaN() 来判断)。
  • 如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。
  • 如果两个值都是 true,或者都是 false,那么相等。
  • 如果两个值都引用同一个对象或函数,那么相等,否则不相等。
  • 如果两个值都是 null,或者都是 undefined,那么相等。