定义一个变量实现 a == 7 && a == 8 && a == 9

一、定义一个变量实现 a == 7 && a == 8 && a == 9 成立

宽松匹配==会先将左右两边的值转化为相同的类型,然后再进行对比。

1.如果a是一个对象Object,那么在执行a==7的时候会先去调用对象的valueOf方法,如果该对象没有valueOf方法或者返回的还是对象;nul不算,就会继续调动对象的toString方法。

//1.第一种解决方案
		var a = {
            i: 7,
            valueOf: null,
            // valueOf: () => {
            //     // 此处还使用了++操作符  i++ 先使用后赋值
            //     // ++i 先赋值再使用
            //     return a.i++
            // },
            toString: () => {
                // 此处还使用了++操作符  i++ 先使用后赋值
                // ++i 先赋值再使用
                return a.i++
            }
        }
        
        console.log(a == 7 && a == 8 && a == 9) // true
        
//2.第二种解决方案
        var b = {
            i: 1,
            k: ''
        }

        // 该方法会直接在对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象
        // Object.defineProperty(obj, prop, descriptor)
        // obj  对象  prop 要定义或修改的属性的名称   descriptor  将被定义或修改的属性描述符
        Object.defineProperty(b, 'k', {
            get: function() {
                return b.i++
            }
        })
        console.log(b.k == 1 && b.k == 2 && b.k == 3);

2.如果a是一个数组Array,数组也是对象,继承了对象的valueof方法和tostring方法;在进行转换时,如果有valueOf和toString方法,则也是先调用valueOf方法,如何没有valueof方法,则会调用tostring方法,如果没有前面两种方法,则会去调用join方法

 //3.第三种解决方法
 var a = [1, 2, 3]
        a.toString = function() {
            console.log('调用了toString')
        };
        a.join = function() {
            console.log('调用了join')
        };
        a.valueOf = function() {
            console.log('调用了valueOf')
        };
        console.log(a == 1 && a == 2 && a == 3)
        
        //运行结果:console.log('调用了valueOf')
        //          false
        
        var a = [1, 2, 3]
        a.valueOf = a.shift;
        a.toString = a.shift;     
 //对于数组对象,toString 方法返回一个字符串,该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接(由逗号隔开)组成。
//可以看到数组 toString 会调用本身的 join方法,这里把自己的join方法该写为shift,每次返回第一个元素,而且原数组删除第一个值,正好可以使判断成立。这里 == 比较也带来的副作用
// 此处有点儿不明白(toString调用本身的join方法,后面回来补充)
        a.join = a.shift;
        console.log(a == 1 && a == 2 && a == 3);// true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值