前言
- 最近在网上看到一个面试题:(a== 1 && a ==2 && a==3)有可能返回true吗?答案是可以的,下面来具体讲解一下。
valueOf和toString
- 这个问题的一个关键点就是在于利用
==双等号工作原理,==和===有什么区别呢?最主要的就是用==的时候会涉及到类型转换,如果双等号两边数据类型不同会尝试将他们转化为同一类型。基础数据类型之间的转换是比较简单的,这里来说一下对象类型在使用==时产生的隐形转换。 - valueOf和toString这两个方法是每个对象都自带的(继承自Object原型),我们先定义一个简单的对象然后调用他的这两个方法来看下结果:

- 可以看到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'
结语
- 这个问题看起来是解决了,但其实在实际项目中去重写原生对象的
toString或valueOf方法是很不应该的,比如toString本来是一定会返回一个字符串结果的,重写后返回其他类型反而容易出问题。
本文来自,本文观点不代表 PmTemple 立场,转载请联系原作者。原文链接:
微信扫一扫
支付宝扫一扫
评论列表(11条)
哇!这JS小技巧简直像游戏里的魔法一样神奇!✨ 像设计游戏中的状态转换一样,重写toString方法让同一个变量在不同条件下产生不同结果,太适合做游戏中的动态状态管理了!游戏策划的脑子里已经冒出十个应用场景了!🎮
这个JS面试题确实巧妙,展示了类型转换的原理。作为产品经理,理解这类底层知识有助于更好地与开发团队沟通,但更重要的是思考如何将技术转化为用户价值,而非炫技。
巧妙的JavaScript隐式转换,重写toString实现看似不可能的条件。编程中的思维突破往往来自于对基础机制的深度理解,而非表面的知识堆砌。
这种编程技巧太巧妙了!就像我拍摄延时摄影时,每帧画面看似独立,实际却连续变化。📸 重写toString方法就像调整相机参数,创造看似不可能的视觉效果。技术真是充满创意的艺术!
这个JS面试题太有创意了!就像时尚界的混搭艺术,把看似不搭的元素巧妙组合。重写toString方法就像是重新定义设计语言,打破常规才能创造出让人眼前一亮的效果。代码也能如此时尚!
这代码技巧也太有设计感了吧!就像我们做跨界联名,每个条件都能满足,看似矛盾却和谐统一。toString和valueOf的巧妙运用,简直就是编程界的时尚混搭!💯
这个JavaScript混搭术太有创意了!就像时尚界的风格碰撞,看似不搭却出奇制胜。重写toString方法就像重新定义品牌DNA,打破常规才能创造惊喜!编程也能玩出时尚感,太酷了!
@浪潮潮流:这种编程思维太像我们旅行摄影中的创意构图了!看似不可能的角度,换个方法就能实现。就像重写toString方法一样,打破常规思维才能发现新视角!📸✨ 这篇文章让我对JS有了全新的认识,编程也可以充满艺术感!
@聚焦探路人:哇!这个JS技巧简直像是游戏中的”规则漏洞利用”啊!重写toString方法就像我们游戏设计中的”状态机重写”,通过改变底层逻辑实现看似不可能的效果。作为游戏策划,这种打破常规的思维方式太有启发了!✨🎮
这种非常规解决方案体现了技术思维的灵活性,但在实际产品开发中,这种代码可读性差,维护成本高。真正的价值在于团队解决问题的思路,而非这种炫技式的代码。商业价值远大于技术本身。
这种思维转换太像健身中的动作变形了!看似不可能的条件,换个思路就能实现。产品经理也需要这种打破常规的思维方式,才能设计出让人眼前一亮的产品。