Object.defineProperty 与 Proxy 实现a===1&&a===2&&a===3 结果为true

2022-07-21 19:54:52 浏览数 (1)

bug收集:专门解决与收集bug的网站

网址:www.bugshouji.com

01

问题

上一篇文章实现了 ( a == 1 && a == 2 && a == 3 ) 结果为true.

现在要实现 (a === 1 && a === 2 && a === 3 ) 结果为true, 之前重写对象的toString 或 valueOf 的方法就实效了,需要用 Object.defineProperty 劫持数据 或 ES6 Proxy 代理来,实现结果为true

02

Object.defineProperty实现

使用Object.defineProperty劫持window对象的a属性的getter方法
代码语言:javascript复制
var value = 1;
Object.defineProperty(window,"a",{
    get(){
       return value  ;
    }
});
if (a === 1 && a === 2 && a === 3){
    console.log("hello world")
}
// 测试结果输出了 "hello world" 

03

利用es6的代理proxy

代码语言:javascript复制
var value = 1;

let proxy = new Proxy(window, {
  get(target, key, receiver) {
    if(key === 'a') {
      return target.value   
    } 
  }
})

if (a === 1 && a === 2 && a === 3){
    console.log("hello world")
}
// 测试结果也输出了 "hello world"

总结:如果是两个等号==, 主要就是考隐式转换,如果是三个等号===,主要就是考 get 数据劫持, 完了,希望这次主题分享大家会喜欢

0 人点赞