抽象平等比较 ==
比较 x == y 的结果,x 和 y 是值,产生 true 或 false,判定规则顺序如下:
- 如果 x 的类型与 y 的类型相同,则返回 x === y ,即进行严格平等比较
- 如果 x 为null,y 为 undefined,则返回 true
- 如果 x 为undefined,y 为 null,则返回 true
- 如果 x 为数值类型,y 为字符串类型,则返回 x == ToNumber(y)
- 如果 x 为字符串类型,y 为数值类型,则返回 ToNumber(X) == y
- 如果 x 为 BigInt 并且 y 为字符串,则
- 将 y 转换为BigInt,let n = StringToBigInt(y)
- 如果转换结果 n 是 NaN,则返回false
- 否则返回 x == n
- 如果 x 为字符串类型,y 为BigInt类型,返回 y == x ,即再次走上一个条目的过程
- 如果 x 是 Boolean 类型,则返回 ToNumber(x) == y
- 如果 y 是 Boolean 类型,则返回 x == ToNumber(y)
- 如果 x 是 String、Number、BigInt 或 Symbol中的任意一种,而 y 的类型是 Object,则返回 x == ToPrimitive(y)
- 如果 x 是 Object,而 y 的类型是 String、Number、BigInt 或 Symbol中的任意一种,则返回 ToPrimitive(x) == y
- 如果 x 是 BigInt,而 y 是Number类型,或者 x 是 Number 类型,y 是 BigInt 类型,则:
- 如果 x 和 y 有任何一个值为 NaN、+∞ 或 -∞,则返回false
- 如果 x 代表的数学值与 y 代表的数学值相同,则返回 true,否则返回 false
- 返回 false
Note:
- ToPrimitive(x)
改操作首先会检查值 x 是否含有 valueOf() 方法, 如果有,则返回基本类型的值,进行强制类型转换。
如果没有则使用 toString() 的返回值进行强制类型转换。
如果 valueOf() 和 toString() 都没有返回基础类型的值,则抛出 TypeError 错误
严格平等比较 ===
比较 x === y 的结果,x 和 y 是值,产生 true 或 false,判定规则顺序如下:
- 如果 x 的类型和 y 的类型不同,直接返回 false
- 如果 x 的类型是 Number 或是 BigInt,则返回 Type(x)::equal(x, y)
- 如果 x 和 y 都不是数值类型的值(不是 Number 和 BigInt类型),且类型相同
- 如果 x 的类型为 undefined,则返回 true
- 如果 x 的类型为 null,则返回 true
- 如果 x 的类型是 String,且如果 x 和 y 是完全相同的字符串序列,则返回 true,否则返回 false
- 如果 x 的类型是 Boolean,则两者相同返回 true,否则返回 false
- 如果 x 的类型是 Symbol,如果两者是相同的 Symbol 值,则返回 true,否则返回 false
- 如果两者指向同一个对象 Object,则返回 true,否则返回 false
Refer: https://www.ecma-international.org/ecma-262