这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
js==的运算机制
问:下面代码中问号部分写什么,才能让表达式返回true? 这其实是一道大厂面试题。
//问号处写什么,会使下面的表达式输出一个true
var a =?
console.log(
a == 1 && a == 2 && a == 3
);
意思是a既要等于1 ,又要等于2 ,又要等于3
看似很不正常,为什么会有人这样写代码呢?
但仔细想想 会发现考察的是==号运算符的运算规则以及类型转换的规则,如果这两个只是你不太懂,那这道题可能解不出来。
a=1不行吧,a=2,a=3 都不行。结果肯定为 false
想要搞懂这个,要先知道==号运算符是怎么运算的。
也就是说==两边的类型不一样,会先转为原始类型进行比较,比如一边是字符串或数字,一边是对象,它会把对象转为原始类型再进行比较。
举个例子:
let obj = {}
console.log(obj == 1);
上面面例子中会先调用obj的valueOf
console.log(obj.valueOf());
很显然并不能转为原始类型,就会在调用toString方法
console.log(obj.toString());
会得到一个字符串:[object Object],可以验证一下:
let obj = {}
console.log(obj == '[object Object]');
如果不想改这个1,你也可以:
let obj = {
valueOf: function () {
return 1
}
}
console.log(obj == 1);
他还是会返回true
看懂了这个,回过头来再看这道题你就有答案了
//问号处写什么,会使下面的表达式输出一个true
var a =?
console.log(
a == 1 && a == 2 && a == 3
);
因为他是比较三次,所以obj依次返回,2,3就可以,你可以这样:
var a = {
// 声明一个属性值为1
n: 1,
valueOf: function () {
// 每次返回自增加1
return this.n++
}
}
console.log(
a == 1 && a == 2 && a == 3
);
你就会得到一个true
其实这道题考察的就是我们的==运算以及类型转换的规则
最后留一个问题
把最后一次比较的值改为4 那应该怎么写呢?
//问号处写什么,会使下面的表达式输出一个true
var a =?
console.log( a == 1 && a == 2 && a == 4 );
有知道答案的可以在评论区留言哦!