一道前端面試題引起的思考

直接開始題目是

if(a==1 && a==2 && a==3){
    alert('厲害了')
}

說句實話開發中誰寫成這樣保證會被打死。面試

不過面試就是面試,有面試官的考量點。api

我理解的點有兩個數組

一、隱式類型轉換

先說說隱式類型轉換有幾種狀況post

先說條件判斷 ==
  • String和Number比較:'1' == 1,字符串會調用Number()方法轉爲數字後再比較。
  • Boolean和Number比較:true == 1, Boolean調用Number()方法轉爲數字後再比較。
  • 布爾值和字符串比較:true == '1',會將雙方調用Number()轉換爲Number,而後再進行比較。

總結一句話,==兩側非Number都會調用Number()轉化後再調用。this

再說說 + - * /運算符

它們四個能夠分兩類,+和其它,咱們都知道+既能夠作運算符也能夠作字符串連接。spa

1+1 = 2
1+"1" = "11"
2-'1' = 1
2*'1' = 2
2-/'1' = 2

除了+號運算符,其它運算符兩側若是有字符串數字的話也是會調用Number轉換再運算。3d

聊到這裏你發現這和題目沒毛關係啊!過來人告訴你 冷靜!往下看code

二、valueOf / toString等原生api的掌握程度對象

針對對象的valueOf / toString等原生api,咱們看數字和對象的比較/數字和對象的運算blog

以上咱們總結單純的隱式類型轉換沒辦法解決問題

js裏除了空字符串、數字0、null、undefined、false、NaN爲假 其它均爲真。

JavaScript調用valueOf方法將對象轉換爲原始值。你不多須要本身調用valueOf方法;當遇到要預期的原始值的對象時,JavaScript會自動調用它。官方是這麼說的。

1 == {
    valueOf:()=>{
        return 1
    }
}

//true

從結果看 對象會自動調用valueOf方法

這樣咱們就能夠改爲:

a = {
      value :0,
      valueOf :function(){
            this.value++
            return this.value
      }
}

1==a //true
2==a //true
3==a //true
//結果爲true,每次隱式類型轉換的過程都會自動調用valueOf。

//接下來講toString

//都有valueOf了 還說toString幹嗎,的確默認都會調用,只不過有優先級。
//我只能說js做者很牛逼。

//若是同時有包含它們兩個(valueOf和toString會怎麼樣

a = {
      value :0,
      valueOf :function(){
            this.value++
            return this.value+'aa'
      },
      toString:function(){
           this.value+=2
           return this.value
      }
}

image.png

規則就是這樣,當valueOf返回不爲基本類型的時候,回去調用toString方法。

調用了三次結果變爲6

還有一個很騷的方法,是從一個小姐姐博客看到的,http://www.javashuo.com/article/p-mjmicfsr-ch.html
文章第六題:我聊的這個就是這個題,不過感受小姐姐聊得更專業點。

let arr=[1,2,3]
arr.join = arr.shift
arr ==1
arr ==2
arr ==3

結果完美,不太小姐姐的意思是數組的toString方法會自動觸發數組的join。
這個真是厲害了!
相關文章
相關標籤/搜索