- 这是今天在一篇文章看到的一道题,问题是:
- 能否让
(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
网友评论