美文网首页程序员码农的世界WEB前端程序开发
记一道有十分有意思的JS面试题

记一道有十分有意思的JS面试题

作者: 张培跃 | 来源:发表于2019-04-02 22:34 被阅读6次

    前段时间,有一学生问了我一道十分有意思的JS面试题,现拿出来与大家进行下分享,题目如下:


    下面代码中a在什么情况下会打印1?:

    var a = ?
    if (a == 1 && a == 2 && a == 3) {
        console.log(1);
    }
    

    这题目猛一看,怎么可能?但事实上答案其实很简单,如下:

    var  a = {
        i: 1,
        toString: function () {
            return a.i++;
        }
    }
    if (a == 1 && a == 2 && a == 3) {
        console.log(1);
    }
    

    看不明白?到现在是否有种怀疑自己学过的JS是假的感觉?来看下解题思路:

    1、对象在与字符串拼接或比较时,首先会通过valueOf()方法来调用其原始值。原始值即其本身的值。
    var a ={};
    console.log(a.valueOf());// {}
    console.log(a === a.valueOf());// true
    console.log(typeof a.valueOf());// object
    
    2、如果值为对象,则会调用toString()方法。若对象本身没有该方法,会返回"[object ObjectName]",其中 ObjectName 是对象类型的名称。
    var a = {};
    console.log(a.toString());// [object Object]
    console.log(a.toString() + 1);// [object Object]1
    console.log(a + 1 === a.toString() + 1);// true
    
    3、该对象obj下如果有toString()方法,会调用该方法。
    var a = {
        toString(){
            return 1;
        }
    };
    console.log(a.toString());// 1
    console.log(a.toString() + 1);// 2
    console.log(a + 1 === a.toString() + 1);// true
    
    4、通过以上三点推断出:对象每进行一次比较或拼接都会执行toString方法。
    var num =1;
    var a = {
        toString(){
            return ++num;
        }
    };
    console.log(a+"");// 2
    console.log(a+"");// 3
    console.log(a + 1);// 5
    console.log(a == 5);// true
    
    5、现在再来看下答案是不是很简单了?
    var  a = {
        i: 1,
        toString: function () {
            return a.i++;
        }
    }
    if (a == 1 && a == 2 && a == 3) {
        console.log(1);
    }
    

    —————END—————

    喜欢本文的朋友们,欢迎关注公众号 张培跃,收看更多精彩内容!!!公众号回复 电子书 ,送你经典前端电子书籍!

    相关文章

      网友评论

        本文标题:记一道有十分有意思的JS面试题

        本文链接:https://www.haomeiwen.com/subject/dyckvqtx.html