遇到一道面试网红题 a 为什么情况下a == 1 && a == 2 && a == 3
为 true
看到大佬博客给了种方案
let a = new Proxy({}, {
i:1,
get() {
return ()=>this.i++
}
});
const __res = a == 1 && a == 2 && a == 3;
想问下各位看官大佬 为什么Proxy get() 要返回一个函数啊?
我直接return this.i++
就报错了...
遇到一道面试网红题 a 为什么情况下a == 1 && a == 2 && a == 3
为 true
看到大佬博客给了种方案
let a = new Proxy({}, {
i:1,
get() {
return ()=>this.i++
}
});
const __res = a == 1 && a == 2 && a == 3;
想问下各位看官大佬 为什么Proxy get() 要返回一个函数啊?
我直接return this.i++
就报错了...
不用 Proxy 这么复杂。。。
a = {
value:0,
valueOf:function(){
console.log('valueof');
return ++this.value;
},
}
console.log(a==1 && a==2 && a==3)
当a==1
时,发现两边类型不一样,于是去调用a
的toString/valueOf
,而你上述的代码,将toString/valueOf
劫持了,换成为函数()=>this.i++
==两边类型不一样时,因为左边是proxy,所以它会访问该对象的Symbol(Symbol.toPrimitive)这个属性,取出来之后执行,所以你返回一个数字会报is not a function,因为它把数字当函数执行了
// 方法1
var a = {
i: 0,
toString() {
return ++this.i
}
}
// 方法2
var b = 0;
Object.defineProperty(window, 'a', {
get: () => {
b++;
return b;
}
});
// 方法3
var a = [1, 2, 3];
a.toString = a.shift
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
6 回答2.3k 阅读
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
因为比较操作符在比较数字的时候如果比较的对象非数字,则会调用该对象的
Symbol.toPrimitive
方法,不存在继续调valueOf
方法,不存在继续调toString
方法,proxy的get操作拦截的是对象的属性访问,所以当比较proxy和数字时相当于转换为a[Symbol.toPrimitive]() == 1
;所以get需要返回一个函数