'==' 你了解多少?

170 阅读4分钟

废话不说,直接上菜!

a 满足什么条件时 下述表示式返回 true

if (a == 1 && a == 2 && a == 3) {
  console.log("true");
}

咋一看,我尼玛这样还能成立?内心os:又是一道八股文,内心在问自己,面试问到这道题我能答出来吗?其他人能答出来吗?

三连击 完毕了,可以开始 我们的正题了。你也不要怕,让我来告诉你正确的答案吧🤓🤓🤓🤓🤓🤓🤓

沉下心来,好好看看这一道题,到底考的是什么?

你的内心OS: 肯定会说,笔者怕不是二傻子吧,这还不明显吗,看见 ==,那不就是 考察类型转化吗? 恭喜你,你已经击败 一半的人了,接下来一半,就让我们继续击败他们吧!

首先我们要知道 == 涉及到类型转换的相关知识,这里我已经从各个渠道总结了一套规律(如若不完整,不正确的地方,望大家指出!)

== 会进行类型转换,转换规则如下:(按照1,2,3,4,5的步骤对比)

1.两端类型相同,不做转换,直接比较值

2.两端存在NaN,返回false;

3.undefinednull 只有与自身比较时,或者互相比较时返回true,其他情况返回false;

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

5.一端是原始类型,一端是对象,将对象转换成原始类型再比较,然后进行第四步

 **对象转换成原始类型的步骤**
如果对象有[symbol.toPrimitive]方法,调用该方法,该方法如果返回原始类型,不再进行后续步骤,转换不了抛出异常;
如果对象有valueOf方法,调用该方法,如果返回原始类型,使用该值进行比较,得不到原始类型,继续进行后续步骤;
如果对象有toString方法,调用该方法,如果返回原始类型,使用该值进行比较,得不到原始类型,抛出异常;

现在万事俱备只欠东风,想必各位读者心中已经有答案了吧!那就快来看看和笔者的答案是否一样吧!

var a= {
    value:1,
    valueOf:function(){
        return this.value++;
    },
    toString:function(){
        return this.value++;
    },

    [Symbol.toPrimitive]:function(){
        return this.value++;
    }


}

if (a == 1 && a == 2 && a == 3) {
  console.log("true");
}

image.png

哎呦不错哦,完美解答!你和我是一样的吗?😎😎

为了知其然和知其所以然,我们来看看涉及到的三个方法吧!

  1. [Symbol.toPrimitive]
  2. valueOf
  3. toString

咱就不参考其他资料了,直接上MDN吧!

  • Symbol.toPrimitive

附上地址 官方解释:Symbol.toPrimitive 是内置的 symbol 属性,其指定了一种接受首选类型并返回对象原始值的表示的方法。它被所有的强类型转换制算法优先调用。

官方例子:

const object1 = {
  [Symbol.toPrimitive](hint) {
    if (hint === 'number') {
      return 42;
    }
    return null;
  }
};

console.log(+object1);
// Expected output: 42

image.png

我的理解是其实和官方的理解是一样的! 哈哈哈哈 我也装模作样的用自己的话解释一下吧!

  • [Symbol.toPrimitive]

JavaScript 中的一个内置 Symbol,它允许对象自定义转换为原始值的行为。当一个对象被强制转换为原始值时,JavaScript 引擎会优先调用对象的 [Symbol.toPrimitive] 方法,以确定对象应该如何转换为原始值。[Symbol.toPrimitive] 方法是一个函数,它不接受任何参数,并且应该返回对象的原始值表示。

  • valueOf

当一个对象需要被转换为原始值时,比如使用比较操作符(如 ==)或进行算术运算时,JavaScript 引擎会尝试调用对象的 valueOf 方法。如果对象具有 valueOf 方法,将会调用该方法并返回其结果作为原始值。通常情况下,valueOf 方法用于返回对象的一个适当的原始值表示。

  • toString

当一个对象需要被转换为字符串时,比如进行字符串拼接、输出到控制台或使用字符串相关的方法时,JavaScript 引擎会尝试调用对象的 toString 方法。如果对象具有 toString 方法,将会调用该方法并返回其结果作为字符串。通常情况下,toString 方法用于返回对象的一个字符串表示。

需要注意的是,在某些情况下,JavaScript 引擎可能会先尝试调用 valueOf 方法,如果返回的结果不是原始值,才会继续调用 toString 方法来获取字符串表示。

写到最后:

  1. 希望大家指出本文中出现的错误!
  2. 你们还有更好的解法吗?