面试题之“a==1 && a==2 && a==3 为true”解析
这是在国外的一道面试题看到的,大家先自己想一下,在什么情况下这个判断会成立?按正常思维想,这个是不可能成立的,但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等方法了,而“==”为值相等(相等运算符),所以在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。
所以能用“===”的地方尽量用“===”,相等运算符隐藏的类型转换,会带来一些违反直觉的结果。
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!