题目:当a为什么时,以下代码打印为true?
想要弄清这个问题,首先得明白JavaScript的隐式类型转换,就比如:
为什么number类型的1与String类型的1结果为true?而bool类型true与number类型的1结果为true?我们不妨先来了解一下相等比较的规则
相等比较(==)
1、如果两个操作数类型相同,那么严格执行比较;
2、如果两个操作数类型不同,则进行类型转换后再进行比较,规则如下:
(1)数字和字符串比较,先将字符串转换为数字,再比较值。
(2)布尔值和其它类型的值比较时,先将布尔值转换为数字再比较。true转换为1,false转换为0。
(3)当数字、布尔值或字符串与对象比较时,先将对象转换为简单类型再比较。javascript的内置对象一般会先尝试valueOf()转换,再尝试toString()转换。
3、null与undefined相等。
看到这里,我们是否可以解释1与‘1’的结局为true呢,那么回到题目,想要a==1&&a==2&&a==3,我们只能调用对象的valueof()或toString(),来修改a返回出来的结果,而这两种方法我们该如何选择,又有什么不同呢?我来举个例子:
可以看到,obj与字符串2并不相等,与数字1相等,也就是说obj并没有调用toString(),那obj什么时候调用toString()呢?只有当valueOf()返回的结果不是基本数据类型的时候,才会调用toString(),比如:
这个时候,obj就会调用toString()了,最后回到正题,我们只需在a的valueOf()上做点手脚,就能顺利解决这个问题了,这道题的答案就是:
var a = {
val:1,
valueOf: function () {
return this.val++;
}
};
console.log(a == 1 && a == 2 && a == 3);//true、
今日附加题:
//当a为何值时,使下面的表达式为true
var a = ????;
console.log(a == 2 && a == 4 && a == 8);