# 如何实现 a==1&&a==2&&a==3 为 true?

因为==具有隐式转换,将 2 个不同类型的数据比较会转换各种类型至一致,在比较值是否相等。
==比较会转字符串再比较,调用 toString 方法。

var a = {
  value: 0,
  toString() {
    console.log('toString', 222);
    return ++a.value;
  }
};
console.log(a == 1 && a == 2 && a == 3); //true
1
2
3
4
5
6
7
8

# 如何实现 a===1&&a===2&&a===3 为 true?

===要求类型和值都一样,不调用 toString 方法,可以用 Object.defineProperty 定义 a,走 getter

var _a = 0;
Object.defineProperty(window, 'a', {
  get() {
    console.log('get');
    return ++_a;
  }
});
console.log(a === 1 && a === 2 && a === 3); //true
1
2
3
4
5
6
7
8

提示

此方法同样适用于上面的问题