/**
问题:如何定义a才能使console.log(a==1 && a==2 && a==3) // 输出true
**/
解题思路:首先要明白a要同时满足1、2、3肯定只能通过对象的方式来处理,然后根据“==”的比较规则,重新定义内置转换来满足比较条件。
拓展知识
等号“==”、“===”的比较规则
- 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false转换为0, true转换为1。
- 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较。
在进行比较时,这两个操作符会遵循如下规则。
- null和undefined相等。
- null和undefined不能转换为其他类型的值再进行比较。
- 如果有任一操作数是NaN,则相等操作符返回false,不相等操作符返回true。记住:即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN。
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true。否则,两者不相等。
下表总结了一些特殊情况及比较的结果。
根据以上比较规则我们可以了解到假如一个操作数是对象,另外一个操作数不是则调用对象的valueOf()方法取得其原始值。意思就是说会valueOf() 如果无法转换其实还是调用toString()。
那么这道题就迎刃而解了
var a = {
v: 1, // 定义一个初始值
valueOf: function() {
return this.v++;
}
}
console.log(a == 1 && a == 2 && a == 3) // true
以上就是这道题的解题过程,如果你有更好的办法或者优化点欢迎大佬指点