美文网首页让前端飞
经典面试题之“a==1 && a==2 && a==3 为tru

经典面试题之“a==1 && a==2 && a==3 为tru

作者: 李佳明先生 | 来源:发表于2018-03-22 13:50 被阅读0次

    这是在国外的一道面试题看到的,大家先自己想一下,在什么情况下这个判断会成立?
    按正常思维想,这个是不可能成立的,但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等方法了,而“==”为值相等(相等运算符),所以在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。
    所以能用“===”的地方尽量用“===”,相等运算符隐藏的类型转换,会带来一些违反直觉的结果。

    相关文章

      网友评论

        本文标题:经典面试题之“a==1 && a==2 && a==3 为tru

        本文链接:https://www.haomeiwen.com/subject/dcxaqftx.html