JavaScript:(a == 1 && a == 2 && a == 3)能输出true么?

  • 这是今天在一篇文章看到的一道题,问题是:
    • 能否让 (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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,755评论 0 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,273评论 19 139
  • 我昨晚知道了最让我崩溃的消息,你劈腿你还怪我,然后我问你我哪不好,你又说不出来,反正是我对你没有吸引力了。 你别说...
    抱抱胖胖阅读 1,711评论 0 0
  • 辛勤耕耘育桃李 三尺讲台抒辉煌 ——记盖州市归州中学优秀教师刘佳 她犹如春雨——润物无声,她犹如花朵——灿烂绽放...
    渤海经济圈阅读 5,787评论 0 1
  • 总以为江南的春光是灿烂的,谁会留意江南初秋的烟雨更加迷人!早上起来,觉知秋意渐浓,需添衣度寒,岂料地域不熟,走下车...
    维维心诚轩逸若彬阅读 1,378评论 0 0

友情链接更多精彩内容