几步让你记住JS中等号运算符的运算和转换规则

67 阅读1分钟

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

  1. 两端类型相同,比较值

    如果是对象,就是比较对象与对象的地址

  2. 只要等号两端存在 NaN,返回 false

    NaN == [] , NaN == null , NaN == 0 , NaN == NaN ,'a' == NaN都是false

  3. 两端出现undefined 和 null 只有自身与自身比较,或者这俩互相比较时,才会返回 true,其他时候都是false

    null == undefined 这是true,null == [],null == 'null' 这是false

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

    true == 1,这是true,因为 +true转为数字是1,'a' == 1,这是false,因为 +'a'是NaN,又跳到第二步,所以是false

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

    那么对象如何转原始类型?

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

      const a = {
        [Symbol.toPrimitive](){
            console.log('toPrimitive')
            return 1;//得到原始值,如果return this,就得不到原始值,会报错
        }
      };
      if (a == 1 && a == 2 && a == 3) {
        console.log('你好');
      }
      
    2. 调用对象的valueOf方法,对象都有这个方法,因为原型链上有Object,Object有这个valueOf方法

      若该方法能得到原始值,使用该原始值; 若得不到原始值,进入下一步

    3. 调用对象的toString方法

      若该方法能得到原始值,使用该原始值; 若得不到原始值,抛出异常

// 如何让判断成立输出'你好'
if (a == 1 && a == 2 && a == 3) {
  console.log('你好');
}
//答案:
const a = {
  count: 1,
  valueOf() {
    console.log('valueOf');//会打印三次valueOf
    return this.count++;
  },
};
if (a == 1 && a == 2 && a == 3) {
  console.log('你好');
}