我是如何实现a==1&&a==2&&a==3的

173 阅读1分钟

1.利用隐式转换

原理:

规则:当对象和数字比较时,对象首先会调用valueOf(),如果结果是原始值,则返回原始值,否则再调用toString();

因此我们这里重写toString或者valueOf方法即可。

let a = {
            _a: 1,
            toString: function () {
                return a._a++;
            }
        }
     console.log(a == 1 && a == 2 && a == 3);// true
              

2.利用Object.defineProperty

原理:

Object.defineProperty的运用

 let val = 1;        
Object.defineProperty(window, "a", {       
     get: function () {      
          return val++;       
     }      
  })       
 console.log(a == 1 && a == 2 && a == 3);//true

3.利用数组的隐式类型转换特点 一种特殊且巧妙的方法

原理:

Array进行隐式转换调用valueOf得到[1,2,3]---->得到不是原始值---->调用toStirng();

Array.toString()实际上是内部改写为Array.join(",")这个方法,我们将a.join重写为a.shift。

let a = [1, 2, 3];  
 a.join = a.shift;  
 console.log(a == 1 && a == 2 && a == 3);//true