分享一道很有意思的面试题,只修改 obj
内部代码使下方输出的结果为:true
let obj = {
a: 1
}
//输出结果毫无疑问就是false,如何使输出结果为true呢?
console.log(obj == 1 && obj == 2 && obj == 3); //false
题解
let obj = {
a: 1,
valueOf() {
return this.a++
}
}
console.log(obj == 1 && obj == 2 && obj == 3);
想要理解这道题首先要明白 valueOf
是什么
在对象中写一个 valueOf
函数可以通过隐式转换自动触发。比如:比较、计算、隐式转换等等
let obj = {
a: 1,
valueOf() {
return this.a++
}
}
//比较
console.log(obj == true); //true
//计算
console.log(obj + 1); //3
//隐式转换
console.log(!!obj); //true
//直接输出就是一个对象
console.log(obj); //{a: 3, valueOf: ƒ}
由此可知,只要对象发生了比较、计算、隐式转换就会自动触发函数 valueOf
如果你理解了上述,那么答案你应该就自然明白了
let obj = {
a: 1,
valueOf() {
return this.a++
}
}
//见下述解释
console.log(obj == 1 && obj == 2 && obj == 3);
产生隐式转换后a返回1,1==1结果为true,然后a++变成了2,2==2结果为true 依次类推....
上面这道题如果理解了,那就看这一道题,同样的思路
let obj = {
a: 10
}
// 如何使结果为true?
console.log(obj == 10 && obj == 20 && obj == 30);
题解
let obj = {
a: 10,
valueOf() {
if(this.a == 10){
this.a = 20;
return 10;
}else if(this.a == 20){
this.a = 30;
return 20;
}else{
return 30
}
}
}
console.log(obj == 10 && obj == 20 && obj == 30); //true
解释:如果a的值为10就把他的值设置为20然后返回10,如果a的值为20就设置为30并返回20,最后如果a的值不等于10、20就让他返回30
希望明年能够实现月薪过万的目标,这也是我的目标 哈哈哈