这是在国外的一道面试题看到的,大家先自己想一下,在什么情况下这个判断会成立?
按正常思维想,这个是不可能成立的,但nothing is impossible
,首先贴上正确答案代码
const a = {
i: 1,
toString: function () {return a.i++;}
}
console.log(a == 1 && a == 2 && a == 3)
这里做判断时,首先会调用 valueOf 函数,数组调用 valueOf 后返回的还是数组本身,就会再次调用 toString 函数,这里是重写了 toString 方法,并且 return 的是 a.i++,所以每调用一次,都会在上次的值得基础上自加一次,
所以结果为 true。
那么举一反三,这道题再变一下,“a===1 && a===2 && a===3 为 true”改成这样,还能不能成立呢?
最后结果:
这是因为“===”代表全等(严格运算符),即值和类型都相等,其原理为“===”不会进行 隐式转换 ,所以也就不会调用 valueOf 等方法了,而“==”为值相等(相等运算符),所以在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。
所以能用“===”的地方尽量用“===”,相等运算符隐藏的类型转换,会带来一些违反直觉的结果。