Javascript中,如何让‘a==1 && a==2 && a==3’成立呢?

日常开发,在写业务逻辑时肯定会用到if语句,或者三元,来进行下一步的业务操作或是赋值给某个变量?但是变量之间的判断比较,你真的有彻底搞明白吗?

if (a == 1 && a == 2 && a==3 ) {
	// doing something
	console.log('finished')
}

这个if判断能走通吗?答案是可以的。那a到底或是一个什么类型的变量呢?数字?字符串?还是数组或者是对象呢?

在这呢,先不说a到底是什么类型的变量,我们先来了解下 == 比较的特性和藏在他身上的秘密。

== 比较

  1. 先比较变量类型。如果类型一致的话,则进行第二点的比较,如果类型不一致,则将变量转换为基本类型,然后进行比较。至于7与’7’之间的比较,到底是都转换成了Number类型?还是String类型呢?根据规范的话,应该是都被转换成了Number类型进行的比较。
  2. 两边变量的类型一致时,进行值的比较。基本类型与基本类型比较,引用类型与引用类型比较(这个比较的意义不大)。
  3. 这一点作为补充点,也是非常重要的一点。第一点中有说道类型转换,而变量本身的类型转换则是调用自身的两个方法,先是valueOf,如果还不是基本类型,则继续调用toString。

看完以上三点,各位想到如何让 if(a == 1 && a == 2 && a == 3)走通了吗?要不思考🤔两分钟,自己试着写一写?

答案

	{
        let a = {
            a: 1,
            tip: '觉得有用就分享吧,哈哈',
            valueOf: function(){
                return this.a++
            }
        }
        if (a==1 && a==2 && a==3) {  // ok
            // doing something
            console.log('finished')
        }
    }
    
    {
        let a = ['给我点个赞吧,哈哈'];
        Array.prototype.valueOf = function(){
            if (this.length === 1) {
                this.length = 2;
                return 1
            }
            if (this.length === 2) {
                this.length = 3;
                return 2
            }
            if (this.length === 3) {
                this.length = 4;
                return 3
            }
        }
	
        if (a==1 && a==2 && a==3) { // ok
            // doing something
            console.log('finished') 
        }
    }

    {
        let a = new String('你们肯定可以写出无数个');
        let abc = 1;
        String.prototype.valueOf = function(){
           return abc++
        }

        if (a==1 && a==2 && a==3) { // ok
            // doing something
            console.log('finished') 
        }
     }

     // ......

让if (a == 1 && a == 2 && a == 3) 走的通的答案可以有无数个,所以这并不是什么不可能的事情,我在这里只用到了valueOf这一个方法,有兴趣的朋友可以再试一试toString这个方法,还有valueOf的优先级是不是高于toString呢。

这种判断场景可能在实际开发中很少用的到,或许你敲了一辈子代码,也不会遇到,但是这个问题可以帮你更好理解 == 比较时做了哪些动作。还有实际开发中到底应该是用 == 还是应该用 === 呢。相信有很多朋友有遇到过用 == 判断时出现的问题,在这里,附上一份常见的变量之间相互判断比较结果的图片。
在这里插入图片描述
前端小菜鸟,哪里写的不对,还请各位大佬快快指出,非常感谢。
转载请注明出处,写了一个多小时呢,谢谢。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值