前段时间,有一学生问了我一道十分有意思的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是假的感觉?来看下解题思路:
var a ={};console.log(a.valueOf());// {}console.log(a === a.valueOf());// trueconsole.log(typeof a.valueOf());// object
var a = {};console.log(a.toString());// [object Object]console.log(a.toString() + 1);// [object Object]1console.log(a + 1 === a.toString() + 1);// true
var a = { toString(){ return 1; }};console.log(a.toString());// 1console.log(a.toString() + 1);// 2console.log(a + 1 === a.toString() + 1);// true
var num =1;var a = { toString(){ return ++num; }};console.log(a+"");// 2console.log(a+"");// 3console.log(a + 1);// 5console.log(a == 5);// true
var a = { i: 1, toString: function () { return a.i++; }}if (a == 1 && a == 2 && a == 3) { console.log(1);}
上次愚人节答案公布:
答案:阿愚说的是真话,bug是阿节写的。
解题思路:
1、首先不要被题目的情节所误导,因为这道题和愚人节没有半毛钱关系。像这样的题只能用假设解决。
2、假设bug是阿愚写的,则阿愚假话,阿人与阿节为真话,由于只有一人说了真话,与条件只有一人说真话矛盾,假设不成立,故bug不是阿愚写的。
3、假设bug是阿人写的,则阿愚与阿节说的是真话,与条件矛盾,假设不成立,故bug不是阿人写的。
4、假设bug是阿节写的,一号说了真话,阿人与阿节说的是假话,与条件只有一人说真话相符,假设成立。
5、故阿愚说了真话,bug是阿节写的。
最后祝愿大家每天都可以早点下班!