一看题目就知道 a 不可能是个固定的值,且在一个判断为true就要变成下一个判断的值。由此推断,此处需要使用到数据劫持!
Object.defineProperty
1 2 3 4 5 6 7 8
| let num = 1; Object.defineProperty(this,'a',{ get:function(){ return num++ } }) console.log(a===1 && a===2 && a===3)
|
Proxy
发现用proxy也能做这样的事,但是得把a放到对象里(对Proxy理解不是很透彻,不知道还有没有其他写法);
1 2 3 4 5 6 7 8 9 10 11 12
| let obj= new Proxy({a:0},{ get(target,key){ data = Reflect.get(target,key) + 1; this.set(target, key, data) return data; }, set(target,key,value){ return Reflect.set(target, key, value); } }); console.log(obj.a === 1&&obj.a === 2&&obj.a === 3)
|
对象在做比较时的隐式转换
不过这种方法不能使用=== 只能是用 ==判断才能为true;
1 2 3 4 5 6 7 8 9
| const a = { num: 0, valueOf: function() { return this.num += 1 } }; console.log(a==1 && a==2 && a==3);
|
解析在这里