a 为 Object
== 会进行隐式转化,对象通过方法valueOf和toString方法转化,重写a的对应方法即可。
const a = {
i: 1,
// valueOf 也可达到相同效果
toString: function () {
return a.i++;
}
}
a == 1 && a == 2 && a == 3; // true
a 为 Array
对于数组对象,toString方法返回一个字符串,该字符串由数组中的每个元素的toString方法返回值经调用join方法连接(由逗号隔开)组成,所以重写join方法即可。
const a = [1, 2, 3];
a.join = a.shift;
a == 1 && a == 2 && a == 3; // true
a 为 Number
使用defineProperty修改读取a时的逻辑。
let val = 0;
Object.defineProperty(window, 'a', {
get: function() {
return ++val;
}
});
a == 1 && a == 2 && a == 3 // true