ECMAScript中平等比较标准,区分 == 和 ===

抽象平等比较 ==

比较 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值