这篇文章主要讲解了“javascript中如何让“a==1&&a==2&&a==3”成立”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript中如何让“a==1&&a==2&&a==3”成立”吧!
一、问题解析
if (a == 1 && a == 2 && a == 3) { console.log('Win') }
如何让if里面的代码执行,成功在控制台打印出
Win?
看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢?
冷静下来,发现一些端倪。
它没说让a同时等于1 2 3。
而且js是单线程运行的。 即使它们写在了一行,那也是从左到右执行的. 所以它们从时空上面就不是同一时期的东西。
既然不是同一时期的东西,那么一个人当然可以是可以成为小孩子,之后成为过成年人,然后变成老年人了。
回到题目,那么我想要让这个条件成立,就需要获取一次a的同时,让它自增1。
二、解决办法
2.1 toString
第一种方法,利用判断过程中的[隐式转换]的
toString方法。在我的另外一篇为什么[] == ![]结果为true?中详细阐述过。
const a = { _a: 0, toString: function() { return ++a._a } }
运行一次,就给_a加1,然后返回.
因为toString是
Object.prototype上面默认的方法,所以这个办法相当于把正常的隐式转换中
toString方法给拦截了。
涉及原型和原型链的知识点
问题是可以解决了。
评论区的有掘友说让 a = true 也可以解决的。确实很有误导性。其实是混淆了隐式转化的优先级。简单来说,隐式转化是由两部分组成:转化的规则 + 触发转化的条件。
if包着的里面整体触发了
Boolean()的转化规则,
==又字符串在右侧触发
toString()的转化规则。
回到这题,
==的右边是数字,JS运行线路是从左到右的。所以,这个时候触发的是
Number()的规则,把左侧的
true转化为
1之后,两边类型一致之后,那自然不会再触发什么规则了,此时已经不构成隐式转化。所以说
1 == 1 && 1 == 2 && 1 == 3是不成立的。
现在记住了,也比面试过程中的时候再来记好
现在将题目简单修改一下,将双等变成三个等怎么办?
大家都知道
===的话是先判断类型,再判断值。这里的
toString已经默认把对象转化为字符串了.使用
toStirng的话,结果就不成立了.
2.2 defineProperties
使用对象的数据拦截法:
Object.defineProperties(window, { _a: { value: 0, writable: true }, a: { get: function() { return ++_a } } })