大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

JavaScript:(a == 1 && a == 2 && a

  • 这是今天在一篇文章看到的一道题,问题是:
    • 能否让 (a == 1 && a == 2 && a == 3)这个表达式输出为true
    • 答案是:可以
Code:
const a = {
  num: 0,
  valueOf: function() {
    return this.num += 1
  }
}
  • 通过这段代码,可以使得上面的表达式为true
原理:
  1. 表达式使用的是==,而不是===,由于==会有隐性转换的问题,这样在Javascript中就意味着更多的变化
  2. 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