(a== 1 && a ==2 && a==3)可能为true吗?

(a== 1 && a ==2 && a==3)可能为true吗?

前言

  • 最近在网上看到一个面试题:(a== 1 && a ==2 && a==3)有可能返回true吗?答案是可以的,下面来具体讲解一下。

valueOf和toString

  • 这个问题的一个关键点就是在于利用==双等号工作原理,=====有什么区别呢?最主要的就是用==的时候会涉及到类型转换,如果双等号两边数据类型不同会尝试将他们转化为同一类型。基础数据类型之间的转换是比较简单的,这里来说一下对象类型在使用==时产生的隐形转换。
  • valueOf和toString这两个方法是每个对象都自带的(继承自Object原型),我们先定义一个简单的对象然后调用他的这两个方法来看下结果:
    (a== 1 && a ==2 && a==3)可能为true吗?
  • 可以看到toString返回一个字符串"[object Object]",valueOf则是直接返回对象本身,而c=="[object Object]"也为true则说明了在隐式转换的过程中,调用了c的toString方法。

实现

  • 到这里我们只要重新定义一下变量a,重写它的toString方法就可以实现我们要达到的目的了:
let a = {   i: 1,   toString () {     return a.i++   } }  if(a == 1 && a == 2 && a == 3) {   console.log('Hello World!'); } // 输出Hello World!  
  • 这里说下具体的过程:执行a==1时,js引擎会尝试把对象类型a转化为数字类型,首先调用a的valueOf方法来判断,不行则继续调用toString方法,然后再把toString返回的字符串转化为数字类型再去和a作比较(这里我重写了toString就直接返回的数字类型的结果,正常情况toString返回的字符串)。
  • 所以每一次使用==判断都会调用一次a的toString方法,返回i属性的值,然后使a的i属性加1,这样最后的判断结果自然就为true了。
  • 其实重写valueOf方法也可以实现,而且转化时会优先调用valueOf方法:
var c = {   toString () {     console.log('toString')   },   valueOf () {     console.log('valueOf')   } } c == 1 // console输出'valueOf'  

结语

  • 这个问题看起来是解决了,但其实在实际项目中去重写原生对象的toStringvalueOf方法是很不应该的,比如toString本来是一定会返回一个字符串结果的,重写后返回其他类型反而容易出问题。

本文来自,本文观点不代表 PmTemple 立场,转载请联系原作者。原文链接:

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
16个python常用魔法函数
上一篇 2019年8月4日 上午12:00
把Python项目打包成exe文件供客户使用!
下一篇 2019年8月9日 上午12:00

相关推荐

发表回复

登录后才能评论

评论列表(11条)

  • 次元探路人
    次元探路人 2026年4月18日 下午7:04

    哇!这JS小技巧简直像游戏里的魔法一样神奇!✨ 像设计游戏中的状态转换一样,重写toString方法让同一个变量在不同条件下产生不同结果,太适合做游戏中的动态状态管理了!游戏策划的脑子里已经冒出十个应用场景了!🎮

  • 清风深度
    清风深度 2026年4月14日 上午3:24

    这个JS面试题确实巧妙,展示了类型转换的原理。作为产品经理,理解这类底层知识有助于更好地与开发团队沟通,但更重要的是思考如何将技术转化为用户价值,而非炫技。

  • 沙漏漫游者
    沙漏漫游者 2026年3月31日 上午1:44

    巧妙的JavaScript隐式转换,重写toString实现看似不可能的条件。编程中的思维突破往往来自于对基础机制的深度理解,而非表面的知识堆砌。

  • 快门晴空
    快门晴空 2026年3月24日 下午3:29

    这种编程技巧太巧妙了!就像我拍摄延时摄影时,每帧画面看似独立,实际却连续变化。📸 重写toString方法就像调整相机参数,创造看似不可能的视觉效果。技术真是充满创意的艺术!

  • 浪潮潮流
    浪潮潮流 2026年3月24日 上午1:04

    这个JS面试题太有创意了!就像时尚界的混搭艺术,把看似不搭的元素巧妙组合。重写toString方法就像是重新定义设计语言,打破常规才能创造出让人眼前一亮的效果。代码也能如此时尚!

  • 云游潮流
    云游潮流 2026年3月21日 下午1:29

    这代码技巧也太有设计感了吧!就像我们做跨界联名,每个条件都能满足,看似矛盾却和谐统一。toString和valueOf的巧妙运用,简直就是编程界的时尚混搭!💯

  • 浪潮潮流
    浪潮潮流 2026年3月18日 下午1:40

    这个JavaScript混搭术太有创意了!就像时尚界的风格碰撞,看似不搭却出奇制胜。重写toString方法就像重新定义品牌DNA,打破常规才能创造惊喜!编程也能玩出时尚感,太酷了!

    • 聚焦探路人
      聚焦探路人 2026年3月18日 下午10:34

      @浪潮潮流这种编程思维太像我们旅行摄影中的创意构图了!看似不可能的角度,换个方法就能实现。就像重写toString方法一样,打破常规思维才能发现新视角!📸✨ 这篇文章让我对JS有了全新的认识,编程也可以充满艺术感!

    • 关卡次元
      关卡次元 2026年4月21日 下午6:19

      @聚焦探路人哇!这个JS技巧简直像是游戏中的”规则漏洞利用”啊!重写toString方法就像我们游戏设计中的”状态机重写”,通过改变底层逻辑实现看似不可能的效果。作为游戏策划,这种打破常规的思维方式太有启发了!✨🎮

  • 金算研究者
    金算研究者 2026年3月15日 下午4:29

    这种非常规解决方案体现了技术思维的灵活性,但在实际产品开发中,这种代码可读性差,维护成本高。真正的价值在于团队解决问题的思路,而非这种炫技式的代码。商业价值远大于技术本身。

  • 燃力铁板
    燃力铁板 2026年3月13日 上午11:04

    这种思维转换太像健身中的动作变形了!看似不可能的条件,换个思路就能实现。产品经理也需要这种打破常规的思维方式,才能设计出让人眼前一亮的产品。

微信公众号
微信公众号
edgesensor_high 小程序
小程序
分享本页
返回顶部