js 你不知道的那些东西——js==的运算机制

73 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

js==的运算机制

问:下面代码中问号部分写什么,才能让表达式返回true? 这其实是一道大厂面试题。

     //问号处写什么,会使下面的表达式输出一个true
      var a =?
      console.log(
        a == 1 && a == 2 && a == 3
      );

意思是a既要等于1 ,又要等于2 ,又要等于3

看似很不正常,为什么会有人这样写代码呢?

但仔细想想 会发现考察的是==号运算符的运算规则以及类型转换的规则,如果这两个只是你不太懂,那这道题可能解不出来。

a=1不行吧,a=2,a=3 都不行。结果肯定为 false

想要搞懂这个,要先知道==号运算符是怎么运算的。

image.png 也就是说==两边的类型不一样,会先转为原始类型进行比较,比如一边是字符串或数字,一边是对象,它会把对象转为原始类型再进行比较。 举个例子:

    let obj = {}
    console.log(obj == 1);

上面面例子中会先调用obj的valueOf

  console.log(obj.valueOf());

image.png

很显然并不能转为原始类型,就会在调用toString方法

console.log(obj.toString());

image.png

会得到一个字符串:[object Object],可以验证一下:

    let obj = {}
    console.log(obj == '[object Object]');

image.png

如果不想改这个1,你也可以:

     let obj = {
      valueOf: function () {
        return 1
      }
    }
    console.log(obj == 1);

image.png

他还是会返回true

看懂了这个,回过头来再看这道题你就有答案了

  //问号处写什么,会使下面的表达式输出一个true
   var a =? 
   console.log(
   a == 1 && a == 2 && a == 3 
   );

因为他是比较三次,所以obj依次返回,2,3就可以,你可以这样:

     var a = {
      // 声明一个属性值为1
      n: 1,
      valueOf: function () {
        // 每次返回自增加1
        return this.n++
      }
    }
   console.log(
      a == 1 && a == 2 && a == 3
    );

你就会得到一个true

image.png

其实这道题考察的就是我们的==运算以及类型转换的规则

最后留一个问题

把最后一次比较的值改为4 那应该怎么写呢?

//问号处写什么,会使下面的表达式输出一个true
var a =?
console.log( a == 1 && a == 2 && a == 4 );

有知道答案的可以在评论区留言哦!