一看题目就知道 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) // true

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

对象在做比较时的隐式转换

不过这种方法不能使用=== 只能是用 ==判断才能为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); // true

解析在这里