a==1 && a==2 && a==3结果是什么?能返回true吗?

552 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

结果是什么

什么,这么无理取闹的问题,a == 1 && a == 2 && a == 3我直接就是控制台粘贴,嗯,符合预期,不然我该思考我对js的理解是不是有什么问题了😅。

image.png

如何返回true

如果你在面试中,面试官就要你来实现这个等式,我们到底能做吗?答案当然是可以的,不然面试官问这么无理取闹的问题,你就该质问他是不是对js的理解有啥偏差了😏

话说回来,这个问题其实很简单,我们可以先来定义a的值,让它同时等于1 && 等于2 && 等于3不就行了?什么,你又说这样不可以,那我们换个思路来捋一下。

a == 1 && a == 2 && a == 3转换成a == a + 1 && a == a + 2,我们能够让这个等式成立么?其实很简单:

const a = Infinity;
console.log(a == a + 1 && a == a + 2); // true

看,无穷大无论加几都是无穷大(叉腰),是不是豁然开朗了。当然这不是回答这个题的准确答案,我们继续往下看。

隐式类型转换

我们想做的其实很简单,使a = 1a == a + 1 && a == a + 2等式成立即可。还记得我们之前学过的隐式类型转换吗,这里贴上之前的文章,忘记的小伙伴可以再复习一下:js中的隐式类型转换

当对象类型和原始类型做相等比较时,对象类型会依照ToPrimitive规则转换为原始类型

我们就可以利用这一规则,定义a为对象,同时给它添加一个valueOf()方法,这样做比较时就能执行某些事件了。

const a = {
    index: 1,
    valueOf: function() {
        return this.index++;
    }
}

这样当a与数字做比较时,就会调用avalueOf事件了。

image.png

执行完当前的判断,a中的index变量就自增,这样就巧妙实现了我们的需求。嗯,看来我对js的理解还是没有什么问题的。

总结

这个问题其实就是数据类型转换的一个小技巧,当前日常开发中不一定会用到,但数据类型的隐式转换还是非常重要的,大家加油💪🏻

前端漫漫长途,我们都在路上,希望可以和小伙伴们一起交流,一起进步。持续更新ing.....