用白话讲解:如何实现a==1 && a==2 && a==3 为true

       前两天遇到了这个有意思的面试题,真的是想破脑袋也没有想明白“a怎么可能同时等于三个数呢”?
       最后看了答案才恍然大悟。虽然那个答案讲的比较抽象,但是今天我就用自己的话来简单给大家讲解一下这道题的一个解法:

在讲解这道题之前,我们首先得了解一下JS的语法规(天)范(坑),那就是:

  • 如果两个值类型相同,则直接比较(双等号比较)
  • 如果两个值不是同一个类型的话,则按照对象→字符串→数字(布尔值→数字)进行相应类型转换,直到两个值的类型相同再进行比较。

说白了就是JS的隐性转换!

废话不多说,直接上图:
在这里插入图片描述
我们做两个实验来验证一下:

  1. 对象和布尔值比较
[] == true;  //false  

数组属于对象,在遇到双等号后隐性转换为了空字符串

  1. 对象和字符串比较
[1,2,3] == '1,2,3' // true

这里数组中的三个数组隐性转换为了字符串的’123’,因此相等!


OK!明白了上面这些JS的知(天)识(坑),那么这道题就迎刃而解了!

我们先来看看答案是什么:

//实现a==1 && a==2 && a==3 为true
var a = {
    
    
    i : 1,
    toString(){
    
    
        return a.i++
    }
}
console.log(a==1 && a==2 && a==3 ) //true

【思路】:

  1. a变成对象

  2. 对象遇到双等号 ------> 隐式转换(会调用对象身上toString方法)

    -------> 由于“++”在i之后,则先返回i值再进行++运算 -------> 即可为true

如此一来,a==1 && a==2 && a==3就可以为true了!!

其实这道题的考点就是考察对JS隐性转换的理解,仔细思考一下,其实也不是很难哦~~~

猜你喜欢

转载自blog.csdn.net/weixin_60297362/article/details/123037725