等号运算符的运算和转换规则

252 阅读1分钟

前景

刷到一个题目,如何让下面的判断成立

if (a == 1 && a == 2 && a == 3) {
  console.log('你牛牛牛')
}

这道题的本质就是要理解等号运算符的运算和转换规则

比较逻辑

从上到下按照规则比较,直到能得到确切的结果为止

  1. 两端类型相同,比较值
  2. 两端存在NaN,返回false

image.png

  1. undefined和null只有与自身比较,或者互相比较时,才会返回true

image.png

  1. 两端都是原始类型,转换成数字比较

image.png

  1. 一端是原始类型,一端是对象类型,把对象转换成原始类型后进入第4步

对象如何转原始类型

  1. 如果对象拥有[Symbol.toPrimitive]方法,调用该方法。若该方法能得到原始值,使用该原始值;若得不到原始值,抛出异常。

image.png

image.png

  1. 调用对象的valueOf方法,若该方法能得到原始值,使用该原始值;若得不到原始值,进入下一步;

image.png

image.png

  1. 调用对象的toString方法,若该方法能得到原始值,使用该原始值;若得不到原始值,抛出异常。

image.png

解题

if (a == 1 && a == 2 && a == 3) {
  console.log('你牛牛牛')
}

那就可以如下解题:

image.png