分享一道很有意思的面试题

分享一道很有意思的面试题,只修改 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

评论区
头像