==
-
相等运算符(
==)检查其两个操作数是否相等,返回一个布尔值结果 -
它会比较不同类型的操作数,并尝试强制类型转换
-
当使用 == 判断时,会将一个转换和另一个格式相同后,再进行比较
== 转换规则
-
如果操作数具有相同的类型,则按如下方式进行比较
-
对象(Object):仅当两个操作数引用同一个对象时返回
true。 -
字符串(String):只有当两个操作数具有相同的字符且顺序相同时才返回
true。 -
数值(Number):如果两个操作数的值相同,则返回
true。+0和-0被视为相同的值。如果任何一个操作数是NaN,返回false;所以,NaN永远不等于NaN。 -
布尔值(Boolean):仅当操作数都为
true或都为false时返回true。 -
大整形(BigInt):仅当两个操作数值相同时返回
true。 -
符号(Symbol):仅当两个操作数引用相同的符号时返回
true。
-
-
如果其中一个操作数为
null或undefined,另一个操作数也必须为null或undefined以返 回true。否则返回false。 -
如果其中一个操作数是对象,另一个是基本类型,按此顺序使用对象的
@@toPrimitive()(以"default"作为提示),valueOf()和toString()方法将对象转换为基本类型。(这个基本类型转换与相加中使用的转换相同。) -
在这一步,两个操作数都被转换为基本类型(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