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

前段时间,有一学生问了我一道十分有意思的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—————

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

发布了126 篇原创文章 · 获赞 401 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/u012149969/article/details/88983321