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

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

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容