先拋出兩個(gè)問題:
1.[]==false 是否成立
2.if([]){ console.log('123') } 能否打印
結(jié)果:其實(shí)第一個(gè)是成立的,第二個(gè)也是能打印的,那么問題來了,既然空數(shù)組等于false成立,為什么還能執(zhí)行if里的語句呢?
要解答這個(gè)看似矛盾的問題,需要從相等操作符和if語句的條件表達(dá)式說起
相等操作符比較規(guī)則
1.如果有個(gè)操作數(shù)是布爾值,則在比較相等性之前,先將其轉(zhuǎn)為數(shù)值,false->0,true->1
2.如果一個(gè)操作數(shù)是字符串,另一個(gè)操作數(shù)是數(shù)值,在比較相等性之前,先將字符串轉(zhuǎn)為數(shù)值
3.如果一個(gè)操作數(shù)是對(duì)象,另一個(gè)操作數(shù)不是,則調(diào)用對(duì)象的valueOf()方法,用得到的基本類型值按照前面的規(guī)則進(jìn)行比較
4.null和undefined是相等的,且在比較之前不能將其轉(zhuǎn)換為其他任何值
5.如果一個(gè)操作數(shù)是NaN,則相等操作符返回false,注意NaN不等于NaN
6.如果兩個(gè)操作數(shù)都是對(duì)象,則比較它們是不是同一對(duì)象,如果兩個(gè)操作數(shù)都指向同一個(gè)對(duì)象,則相等操作符返回true,否則返回false
額外點(diǎn):===僅比較而不轉(zhuǎn)換
第一個(gè)問題可以用以上的3和1來解答
[].valueOf() //返回?cái)?shù)組對(duì)象本身
Number(false) //0
Number([].valueOf()) //0
if語句的條件表達(dá)式,js會(huì)自動(dòng)調(diào)用Boolean()將條件表達(dá)式轉(zhuǎn)換為布爾值
Boolean([]) //true 故第二個(gè)問題可以打印
對(duì)于任何不是null的對(duì)象,Boolean()都可將其轉(zhuǎn)換為true
那么再拋一個(gè)問題:
if(-1){ console.log('123') } 會(huì)打印嗎
其實(shí)同樣會(huì)打印
注意:對(duì)于數(shù)字類型的值,除了0和NaN,Boolean()都可將其轉(zhuǎn)換為true