前两天遇到了这个有意思的面试题,真的是想破脑袋也没有想明白“a怎么可能同时等于三个数呢”?
最后看了答案才恍然大悟。虽然那个答案讲的比较抽象,但是今天我就用自己的话来简单给大家讲解一下这道题的一个解法:
在讲解这道题之前,我们首先得了解一下JS的语法规(天)范(坑),那就是:
- 如果两个值类型相同,则直接比较(双等号比较)
- 如果两个值不是同一个类型的话,则按照对象→字符串→数字(布尔值→数字)进行相应类型转换,直到两个值的类型相同再进行比较。
说白了就是JS的隐性转换!
废话不多说,直接上图:
我们做两个实验来验证一下:
- 对象和布尔值比较
[] == true; //false
数组属于对象,在遇到双等号后隐性转换为了空字符串
- 对象和字符串比较
[1,2,3] == '1,2,3' // true
这里数组中的三个数组隐性转换为了字符串的’123’,因此相等!
OK!明白了上面这些JS的知(天)识(坑),那么这道题就迎刃而解了!
我们先来看看答案是什么:
//实现a==1 && a==2 && a==3 为true
var a = {
i : 1,
toString(){
return a.i++
}
}
console.log(a==1 && a==2 && a==3 ) //true
【思路】:
-
a变成对象
-
对象遇到双等号 ------> 隐式转换(会调用对象身上toString方法)
扫描二维码关注公众号,回复: 13745352 查看本文章-------> 由于“++”在i之后,则先返回i值再进行++运算 -------> 即可为true
如此一来,a==1 && a==2 && a==3
就可以为true了!!
其实这道题的考点就是考察对JS隐性转换的理解,仔细思考一下,其实也不是很难哦~~~