题目的由来
let a = ?;
a==1 && a==2 && a==3 成立
前端如何使a==1 && a==2 && a==3 .. 成立
这道题目其实是多近年来多个大厂的面试题。 因为题目的诡异性让业内不禁深思 其实这道题本意是考验前端同学的基础是否夯实
核心考点
== 比较时会进行隐式转换
- object隐形转时会做什么事
== 对象代理的灵活运用
解法1(推荐)
这种方案的解决思路就是利用 == 对象比较的隐形转换 并重写valueOf方法达到目的;
如果两个值不是同一个类型的话,相应类型转换,直到两个值的类型相同再进行比较。
理解对象隐形转换做了什么事情:
1、 首先会通过 valueOf 转换为原始值 就是获取这个对象
2、 然后 若比较的也是一个对象就直接比较内容
3、 若比较的不是一个对象会继续toString转换为字符串比较 若对面不是字符串就把对面转换为字符串比较
let a={
num:0,
valueOf(){
console.log("valueOf")
},
toString(){
console.log("toString")
}
};
console.log(a == 1)
console.log({haha:"hahah"}.valueOf())
let a={
valueOf(){
return 1
},
};
console.log(a == 1)
let a={
num:0,
valueOf(){
this.num++;
return this.num
}
};
console.log(a==1 && a==2 && a==3 && a==4 && a==5 && a==6 && a==7 && a==8 && a==9 && a==10)
解法2
这种方法就比较直观了 直接通过对象的defineProperty方法代理对象 在get函数控制一下返回值就好了
但这可能不是面试官想要的结果
let a={num:0};
Object.defineProperty(a,"num",{
get(){
return 1
}
})
console.log(a.num==1)