美文网首页
定义一个变量 使等式 a == 7 && a == 8 && a

定义一个变量 使等式 a == 7 && a == 8 && a

作者: _____西班木有蛀牙 | 来源:发表于2019-11-11 12:35 被阅读0次

    文章来自:Alen-Huan

    解决方案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);
    

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

    解决方案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
    

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

    相关文章

      网友评论

          本文标题:定义一个变量 使等式 a == 7 && a == 8 && a

          本文链接:https://www.haomeiwen.com/subject/ffhtictx.html