== 和 ===

86 阅读4分钟

== 操作符(宽松相等)

话不多说直接上图片 > 下面是ECMA最新的标准 > 给大家翻译一下:

image.png
 1. 如果 x 与 y 的类型相同那么就会就行严格比较
 2. 如果 x 是 Null,y 是 Undefined 返回 true
 3. 如果 x 是 Undefined,y 是 Null 返回 true
 4. B.3.6.2内容
    a. 如果 x 是 Object 并且 x 又一个内部插槽,y 是 NullUndefined,返回 true
    b. 如果 y 是 Object 并且 y 又一个内部插槽,x 是 NullUndefined,返回 true
 5. 如果 x 是 number,y 是 String,则把 y 通过 ToNumber 转成 Number 进行比较
 6. 如果 x 是 string,y 是 Number,则把 x 通过 ToNumber 转成 Number 进行比较
 7. 如果 x 是 bigint,y 是 String 的时候
    a. 设置一个 把 y 通过 StringToBigInt 转为 Bigint 赋值给 n
    b. n 为 Undefined 返回 false
    c. n 不是 Undefined,用 n 和 x 进行比较
 8. 如果 x 是 String,y 是 Bigint 的时候,把 x 与 y 变换位置 进行步骤 7 的比较
 9. 如果 x 是 Boolean,则把 x 转为 Number 进行比较
 10. 如果 y 是 Boolean,则把 y 转为 Number 进行比较
 11. 如果 x 是 StringNumberBigintSymbol,y 是 Object,则把 y 通过 ToPrimitive 转为原始值进行比较
 12. 如果 x 是 Object,y 是 StringNumberBigintSymbol,则把 x 通过 ToPrimitive 转为原始值进行比较
 13. 如果 x 是 Bigint,y 是 Number,或 x 是 Number,y 是 Bigint 时
     a. x 或 y 是 NaN|正无穷|负无穷 中的任意一个,返回 false
     b. x 与 y 经过运算比较相等返回 true,否则返回 false
 14. 以上情况都不存在,返回 false

ToNumber转换规则:

1. Undefined 转为 NaN
2. Null 转为 0
3. Boolean ture 转为 1false 转为 0
4. String 通过 StringToNumber 转为 number
5. Symbol 直接抛出错误
6. BigInt 直接抛出错误
7. Object 通过 ToPrimitive 转为 number

StringToNumber转换规则:

1. 包含任何不能被解析为数字的字符,返回 NaN
2."0x""0X" 开头,将其余部分解析为十六进制数,并返回其对应的十进制数值。
3."0" 开头,且其长度大于 1,则将其余部分解析为八进制数,并返回其对应的十进制数值。如果解析后得到的八进制数值包含 89 这两个数字,则该字符串将被解析为 NaN4. 如果字符串 str 以 "-" 开头,则返回负数的 StringToNumber("-str") 的结果。
5. 如果字符串 str 以 "+" 开头,则返回正数的 StringToNumber(str.slice(1)) 的结果。
6. 否则,按照普通的十进制数值解析字符串,并返回其对应的数值。

转化为原始值(ToPrimitive)的步骤

 ToPrimitive 有两个参数接受一个参数 input,以及一个可选参数 preferredType(期望返回的结果类型)当 ToPrimitive 被调用而没有指定提示时,默认为数字
1. input 已经是一个原始值,则直接返回该值
2. input 是一个对象尝试调用该对象的 valueOf() 方法。如果 valueOf() 方法返回的是一个原始值,则将其作为 ToPrimitive 操作的结果返回
3. valueOf() 方法返回的仍然是一个对象,则尝试调用该对象的 toString() 方法。如果 toString() 方法返回的是一个原始值,则将其作为 ToPrimitive 操作的结果返回。
4. toString() 方法返回的仍然是一个对象,则抛出 TypeError 异常。
5. input 既不是原始值也不是对象,则抛出 TypeError 异常。

什么是内部插槽呢?

内部插槽方法是规范用来定义所需行为的伪属性/ -methods。(“抽象操作”是规范的相关机制。)槽代表状态(值),方法描述算法(行为)。它们可能对应于引擎使用的对象的属性,也可能不对应于引擎使用的对象的属性,但用户代码不能使用它们,除非由公共API的某些部分公开。引擎使用的实际实现可能与内部方法勾勒出的非常不同,但为了符合要求,它们必须产生与内部方法一致的行为或结果,这种类型的对象只有:document.all:document.all == null=> true

=== 操作符(严格相等)

image.png

1. 如果 x 和 y 类型不相同,则返回 false
2. 如果 x 与 y 是 number,则返回 Number::equal(x, y)
   a. 如果 x 或 y 的值为 NaN,则返回 false
   b. 如果 x 和 y 的值都是 +0 或都是 -0,则返回 true
   c. 如果 x 和 y 的值相等,则返回 true
   d. 否则,返回 false
3. 如果 x 与 y 是 bigint,则返回 Number::equal(x, y)
   a. 如果 x 和 y 的类型不是 BigInt,则抛出 TypeError 异常。
   b. 如果 x 和 y 都是 NaN,则返回 false
   c. 如果 x 和 y 相等,则返回 true
   b. 如果 x 和 y 不相等,则返回 false
4. 返回 SameValueNonNumeric(x, y) 的结果
   a. 如果 x 和 y 类型不相同,则返回 false
   b. 如果 x 和 y 是 Undefined,则返回 true
   c. 如果 x 和 y 是 Null,则返回 true
   d. 如果 x 和 y 是 Boolean,则返回它们是否相同
   e. 如果 x 和 y 是 String,则返回它们的字符序列是否相同
   f. 如果 x 和 y 是 Symbol 值,则返回它们是否相同
   g. 如果 x 和 y 引用同一个对象,则返回 true
   h. 返回 false