在阅读《Inside JavaScript》第三章时,我了解了平等运算符(==)和匹配运算符(==)之间的区别。 让我们来看看ECMAScript的规范




== 和 ===

首先,==是一个强制的平等运算符。如果操作数在比较时是不同的类型,它允许强制转换。因此,如果你想比较的操作数是不同的类型,它们将首先被转换,然后再进行比较。 **===*是一个严格的平等**操作符,如果操作数属于不同的类型,它不允许强制转换;也就是说,如果操作数属于不同的类型,它们在比较时不会改变其类型。

console.log(1 == "1"); // true
console.log(1 === "1"); // false

对于平等运算符,两个操作数的类型不同,所以我们将它们转换为同一类型(数字)并确定它们相等。严格的平等运算符确定这两个值不相等,因为没有进行类型转换。 因此,大多数JavaScript编码指南不建议使用==运算符进行比较,因为它可能会给类型转换带来错误的结果。



1. IsLooselyEqual

==运算符遵循什么算法进行比较?

ECMAScript 如果你看一下规范,它遵循这个算法。

Untitled

  • 如果x和y是同一类型,使用===运算符比较算法(isStrictlyEqual)。
  • 如果x和y分别是nullundefined,则返回true
  • 当比较字符和数字时,使用ToNumber在比较前将类型强制为数字。
  • 当比较一个字符和一个BigInt时,通过StringToBigInt将字符转换为BigInt,然后进行比较。(7)
  • 如果x或y是一个 “boolean”,在通过 “ToNumber “将其类型强制转换成数字后进行比较。
  • 如果x或y是一个原始类型(String, Number, BigInt),而另一个操作数是一个引用类型的Object,通过ToPrimitiveObject胁迫为原始类型,然后进行比较。
  • 如果x或y是一个BigInt,另一个操作数是一个Number,根据两个条件返回一个值(13-a, 13-b)。
  • 如果上述条件没有返回一个true'值,则返回false’。



没做评论