经典面试题:让 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
方法。
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
}
}
})
复制代码
涉及到对象的访问器相关内容
不知道是否让你想起Vue中的watch或者computed的指令呢?
三、总结
是否会做这道面试题没有任何意义。但是能够了解到这个面试题包含的知识点就很有意思。
从隐式类型转换到原型和原型链,最后到对象的访问权属性。如果要继续延伸的话,Vue的双向绑定的实现原理,class中static的实现等等。
这些就是为什么说,要构建前端的知识体系,能够从一个知识点延伸到相关的其他知识点。
相关文章
- SQL面试题---查询平均交易间隔
- 80%应聘者都不及格的JS面试题
- 性能测试岗位常见面试题
- Tomcat+Servlet面试题都在这里
- 一道非常棘手的 Java 面试题:i++ 是线程安全的吗?
- 【经典面试题】不固定宽高的div水平垂直居中的3种方法
- Android面试全过程优化,最新面试题帮你拿下OC
- 12个View绘制流程高频面试题,面试必问
- 从大专到测开,上海某字母站大厂的面试题,岗位是测开(25K*16)
- 剑指offer面试题26-复杂链表的复制
- 9个Java初始化和回收的面试题
- JAVA面试题:69道Spring面试题和答案
- 面试题-求一个串包括还有一个串的最大子串长度的解法
- 软件测试面试题-会进行用例评审吗
- 面试题
- 【面试必备】Swift 面试题及其答案
- 有关于CSS的面试题和练习
- 12个常规前端面试题及小结
- 李洪强iOS经典面试题32-简单介绍 ARC 以及 ARC 实现的原理
- 50道JavaScript基础面试题(附答案)
- ES6由一道前端阿里面试题的思考