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 数据劫持, 完了,希望这次主题分享大家会喜欢