== 和 === 梳理

289 阅读3分钟

==

  • 相等运算符(==)检查其两个操作数是否相等,返回一个布尔值结果

  • 它会比较不同类型的操作数,并尝试强制类型转换

  • 当使用 == 判断时,会将一个转换和另一个格式相同后,再进行比较

== 转换规则

  1. 如果操作数具有相同的类型,则按如下方式进行比较

    • 对象(Object):仅当两个操作数引用同一个对象时返回 true

    • 字符串(String):只有当两个操作数具有相同的字符且顺序相同时才返回 true

    • 数值(Number):如果两个操作数的值相同,则返回 true+0 和 -0 被视为相同的值。如果任何一个操作数是 NaN,返回 false;所以,NaN 永远不等于 NaN

    • 布尔值(Boolean):仅当操作数都为 true 或都为 false 时返回 true

    • 大整形(BigInt):仅当两个操作数值相同时返回 true

    • 符号(Symbol):仅当两个操作数引用相同的符号时返回 true

  2. 如果其中一个操作数为 null 或 undefined,另一个操作数也必须为 null 或 undefined 以返 回 true。否则返回 false

  3. 如果其中一个操作数是对象,另一个是基本类型,按此顺序使用对象的 @@toPrimitive()(以 "default" 作为提示),valueOf() 和 toString() 方法将对象转换为基本类型。(这个基本类型转换与相加中使用的转换相同。)

  4. 在这一步,两个操作数都被转换为基本类型(String、Number、Boolean、Symbol 和 BigInt 中的一个)。其余的转换是逐个进行的。

    • 如果是相同的类型,使用步骤 1 进行比较。

    • 如果其中一个操作数是 Symbol 而另一个不是,返回 false

    • 如果其中一个操作数是布尔型而另一个不是,则将布尔型转换为数字:true 转换为 1,false 转换为 0。然后再次松散地比较两个操作数。

    • Number to String:使用与 Number() 构造函数相同的算法将字符串转换为数字。转换失败将导致 NaN,这将保证相等是 false

    • Number to BigInt:按数值进行比较。如果数值为 ±∞ 或 NaN,返回 false

    • String to BigInt:使用与 BigInt() 构造函数相同的算法将字符串转换为 BigInt。如果转换失败,返回 false

===

  • 严格相等运算符(===)会检查它的两个操作数是否相等,并且返回一个布尔值结果

  • 相等运算符不同,严格相等运算符总是认为不同类型的操作数是不同的。

=== 判断规则

严格相等运算符(=== 和 !==)提供了严格相等判定语义。

  • 如果操作数的类型不同,则返回 false

  • 如果两个操作数都是对象,只有当它们指向同一个对象时才返回 true

  • 如果两个操作数都为 null,或者两个操作数都为 undefined,返回 true

  • 如果两个操作数有任意一个为 NaN,返回 false

  • 否则,比较两个操作数的值:

    • 数字类型必须拥有相同的数值。+0 和 -0 会被认为是相同的值。

    • 字符串类型必须拥有相同顺序的相同字符。

    • 布尔运算符必须同时为 true 或同时为 false

== 总结

  • 基础类型 number,string,boolen,null,undefined,symbol

  • 如果其中一个操作数为 null 或 undefined,另一个操作数也必须为 null 或 undefined 以返 回 true。否则返回 false

  • 遇到 symbol 就是 false

  • number,string,boolen三者之间的比较都会转number

  • 将字符串转换为数字。转换失败将导致 NaN,这将保证相等是 false