最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 如何令a == 1 && a == 2 && a == 3 返回true

    正文概述 掘金(天大地大老婆最大)   2021-06-26   525

    这是我参与更文挑战的第26天,活动详情查看: 更文挑战

    • 问题描述
    • 在 JavaScript 中, (a == 1 && a == 2 && a == 3) 是否有可能为 true ?

    参考实现

    参考解决思路:a是一个对象或函数,每次调用取值都不一样,以有序的规律变化就能实现多等

    方案一 数字变量名

    var  a = 1;
    var ᅠ1 = a;
    var ᅠ2 = a;
    var ᅠ3 = a;
    console.log( a ==ᅠ1 && a ==ᅠ2 && a ==ᅠ3 );
    
    方案二 重写valueOf()
    var a = {
        value: 1,
        valueOf: function()  {
            return this.value++;
        }
    }
    (a == 1 && a == 2 && a == 3); // true
    
    • 方案说明

      • 从表面看,应该是valueOf()每次都被调用了,但是为什么会这样?我们又没有调用它。

      • 这里的valueOf为什么会被调用?

      • 原因参考==转换规则

      • 如果一个是null,一个是undefined,则它们相等

      • 如果一个是数字,一个是字符串,先将字符串转换成数字,然后使用转换后的值进行比较

      • 如果其中的一个值为true,则转换成1再进行比较;如果其中一个值为false,这转换成0再进行比较

      • 如果一个值是对象,另一个值是数字或者字符串,则将对象转换成原始值再进行比较。转换成字符串时,会先调用toString(),如果没有toString()方法或者返回的不是一个原始值,则再调用valueOf(),如果还是不存在或者返回不是原始值,则会抛出一个类型错误的异常。返回的原始值会被转换成字符串;如果转换成数字时,也是类似的,不过是会先调用valueOf(),再调用toString(),返回的原始值会被转换成数字

      • 其他不同类型之间的比较均不相等

      • 所以在这里使用a与这些字符进行比较时会被转换成数字,此时会默认调用字符串的valueOf()方法,我们将这个方法进行重写,用于拦截处理a的值

      • 同理可以使用toString方法处理,因为字符串转数字类型时会涉及到valueOf()和toString(),道理一样

    let a = {
        value: 1,
        toString: function () {
            return a.value++;    // 这里为什么不用this而已a?因为this作用域可变
        }
    }
    console.log(a == 1 && a == 2 && a == 3);    // true
    
    • 只要符合递增规则的,a就可以实现多等,因为此a非彼a

    方案三ES6 Proxy

    var a = new Proxy({ i: 0 }, {
        get: (target, name) => name === Symbol.toPrimitive ? () => ++target.i : target[name],
    });
    console.log(a == 1 && a == 2 && a == 3);    // true
    
    方案三 使用getter存储器
    var temp = 1;
    Object.defineProperty(window, 'a', {
        get: function() { // 每次取值,temp+1
            return this.temp++
        }
    });
    (a == 1 && a == 2 && a == 3); // true
    (a === 1 && a === 2 && a === 3); // true
    
    • 方案说明
      • 这个是使用getter存储器的方式,也就是以全局变量temp存储一个值,每次调用的时候都++1使得调用a每次都递增1

    方案五:join + shift

    • 对于对象数组进行比较时,这里数组a每次比较的时候都会默认调用toString(),然后toString()又会默认调用join(),这里将join()改为shift(),意思是删除第一个数组元素值并返回
    • 所以这样调用每次都会导致a数组删除第一个值并且返回删除掉的那个值,结合这样的规律,每次比较都取出对应位置的值
    • 这里是1、2、3,只要符合规律返回的值就行
    var a =[1,2,3];
    a.join = a.shift;
    console.log(a);                // (3) [1, 2, 3, join: ƒ]
    // console.log( a ==ᅠ1 && a ==ᅠ2 && a ==ᅠ3 );    // true
    console.log(a == 1);        // true
    console.log(a);                // (2) [2, 3, join: ƒ]
    console.log(a == 2);        // true
    console.log(a);                // [3, join: ƒ]
    console.log(a == 3);        // true
    console.log(a);                // [join: ƒ]
    

    起源地下载网 » 如何令a == 1 && a == 2 && a == 3 返回true

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元