使(a==1 && a==2 && a==3)为true

164 阅读1分钟

今天遇到一个有趣的题,特此记录下

let a = ?;

(a==1 && a==2 && a==3) {
    console.log('yes')
}

a 的值是什么时可以输出 yes,首先 a 肯定不是一个具体的值,那有可能是一个对象,对象在比较的时候会进行 valueOf 方法或 toString 方法,那么可以通过改写 num 方法来改变 a 的值。

let a = {
  val: 1,
  toString() {
    return a.val++;
  }
}

还可以通过 Object.defineProperty 来实现

let num = 0;
Object.defineProperty(window, 'a', {
  get() {
    return ++num;
  }
})

总结

  1. 利用对象比较时会进行 toString 的方法
  2. 利用 Object.defineProperty 劫持 JS 对象的 getter