a == 1 && a == 2 && a == 3的值为true

132 阅读1分钟

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