如何让a==1 && a== 2 && a==3成立

1.双等号

双等号和===的区别是双等号两边数据类型不同会尝试将他们转化为同一类型。这里涉及基础数据类型转换和隐式转换。

1.1_隐式转换中的对象

valueOf和toString这两个方法是每个对象都自带的。定义一个简单的对象然后调用他的这两个方法看下结果。可以看到toString返回一个字符串"[object Object]"。valueOf则是直接返回对象本身。c=="[object Object]"也为true则说明了在隐式转换的过程中,调用了c对象的toString方法。

因此,可以利用对象的隐式转换让式子成立。即下面代码。

var a={
    i:1,
    toString:function(){
        return a.i++
    }
};

if(a==1&&a==2&&a==3){
    console.log('式子成立');
}

【分析过程】执行a==1,引擎执行a.valueOf判断两边是否成立,a.value0f返回的是字串'[object Object]",所以式子不成立,引擎继续调用toString方法,这里重写了a对象的toString方法,返回数字并++,可以发现式子依次成立。

总结:为了解决这个问题才重写了对象的toString方法,但是实际项目中不会去重写原生对象的方法。


说明:本文章学习了gecko大佬,然后在自己的理解上重新书写了此道题目的解决办法。

原文章:(a== 1 && a ==2 && a==3)可能为true吗? - 简书

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值