if(a==1 && a==2 && a==3){
alert('厲害了')
}
複製代碼
說句實話開發中誰寫成這樣保證會被打死。面試
不過面試就是面試,有面試官的考量點。api
我理解的點有兩個數組
先說說隱式類型轉換有幾種狀況bash
String和Number比較:'1' == 1,字符串會調用Number()方法轉爲數字後再比較。post
Boolean和Number比較:true == 1, Boolean調用Number()方法轉爲數字後再比較。ui
布爾值和字符串比較:true == '1',會將雙方調用Number()轉換爲Number,而後再進行比較。this
總結一句話,==兩側非Number都會調用Number()轉化後再調用。spa
它們四個能夠分兩類,+和其它,咱們都知道+既能夠作運算符也能夠作字符串連接。code
1+1 = 2
1+"1" = "11"
2-'1' = 1
2*'1' = 2
2-/'1' = 2
複製代碼
除了+號運算符,其它運算符兩側若是有字符串數字的話也是會調用Number轉換再運算。cdn
聊到這裏你發現這和題目沒毛關係啊!過來人告訴你 冷靜!往下看
二、valueOf / toString等原生api的掌握程度
針對對象的valueOf / toString等原生api,咱們看數字和對象的比較/數字和對象的運算
以上咱們總結單純的隱式類型轉換沒辦法解決問題
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
}
}
複製代碼
規則就是這樣,當valueOf返回不爲基本類型的時候,回去調用toString方法。
調用了三次結果變爲6
還有一個很騷的方法,是從一個小姐姐博客看到的,juejin.im/post/5d124a… 文章第六題:我聊的這個就是這個題,不過感受小姐姐聊得更專業點。
let arr=[1,2,3]
arr.join = arr.shift
arr ==1
arr ==2
arr ==3
結果完美,不太小姐姐的意思是數組的toString方法會自動觸發數組的jion。
這個真是厲害了!
複製代碼