美文网首页前端基础类学习
JavaScript:(a == 1 && a

JavaScript:(a == 1 && a

作者: 饥人谷_米弥轮 | 来源:发表于2018-01-26 00:04 被阅读8次
    • 这是今天在一篇文章看到的一道题,问题是:
      • 能否让 (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

    相关文章

      网友评论

        本文标题:JavaScript:(a == 1 && a

        本文链接:https://www.haomeiwen.com/subject/bqabaxtx.html