- 这是今天在一篇文章看到的一道题,问题是:
- 能否让
(a == 1 && a == 2 && a == 3)这个表达式输出为true
- 答案是:可以
Code:
const a = {
num: 0,
valueOf: function() {
return this.num += 1
}
}
原理:
- 表达式使用的是
==,而不是===,由于==会有隐性转换的问题,这样在Javascript中就意味着更多的变化
-
valueOf这个方法会在当对象需要转换为原始值的时候自动调用,如:
const a = {
num: 0
}
a.valueOf() //--> {num:0}
//用typrof检验 a.valueOf //--> "Object"
-
既然当使用对象需要转换为原始值的时候自动调用
valueOf方法,那么通过原型链的原理,我们就可以重写这个方法,使之返回一个数字、字符串、布尔值,如:
a.valueOf = function() {
return this.num
}
- 而在
(a == 1 && a == 2 && a == 3)这个表达式中,比对是从前往后一步步比对的,那么我们再将每次的返回值+1就可以实现,所以继续将valueOf进行改造,如:
a.valueOf = function() {
return this.num += 1
}
结果:
- 通过上面的原理,通过使用相等于符
==和重写valueOf方法使得(a == 1 && a == 2 && a == 3)这个表达式输出为true