[] == ![];
// true
一個簡單的運算,一共涉及了:運算符優先級,boolean類型的轉換,相等運算符的比較邏輯,數值的轉換邏輯所以還是蠻經典的
- 圓括號()
- 成員訪問.
- 後置遞增|後置遞減++|--
- 邏輯非,一元加,一元減,前置遞增,前置遞減
- 乘法,除法,取模
- 加法,減法
- 大於,大於等於,小於,小於等於
- 等號,非等號,全等
- 邏輯與... && ...
- 邏輯或... || ...
- 條件運算法... ? ... : ...
- 賦值=
首先,是根據運算符優先級來確定運算順序。根據上面列出的常用運算符的優先級,可得出會先運算等號左邊的。
- 只有null, undefined,""(空字符串),0和NaN轉化爲false(這些類型叫假值)。所以[]轉化爲true
- !邏輯非操作符首先會將它的操作數轉換爲一個布爾值,然後再對其取反
- !!兩個邏輯非,作用域Boolean()轉型函數行爲相同
- &&如果左側爲真值,則返回右側值.如果左側爲假值,則返回左側的值
- ||如果左側爲真值,則返回左側值.否則返回右側值
邏輯非會先把變量轉化爲boolean值,再對他做非運算。所以這裏考查,boolean類型的轉換,根據上面所以最終會把![]轉化爲false
- 如果兩個操作數類型相同,用嚴格比較,
- 如果一個是null,另一個是undefined。則相等
- 如果一個是數字,另一個是字符串。則把字符串轉化爲數字,然後比較
- 如果一個是boolean值。則先將其轉爲數字。true爲1,false爲0
- 如果一個是Object,另一個是數字或字符串。則讓把Object轉化爲原始值,再比較。JS先嚐試用valueOf()轉化。再嘗試用toString()轉化。再比較([].toString爲''(空字符串),空字符再變爲0。所以[]==''==0; ![] == !true == false == 0(有boolean值先轉爲數字))
所以會先把false轉換爲數字類型的0。然後再把[]使用toString()把[]轉爲''
- Booean值,true爲1,false爲0
- null,返回0
- undefined,返回NaN
- 對象,先調用ValueOf(),如果是NaN,再調用toString()
- 字符串
- 只包含數字(浮點字符)(包括以正負號開頭),則轉化爲10進制數值(浮點數值)。數字後有其他字符都不行!
- 只包含有效的十六進制格式,被轉化爲16進制
- 空字符串,返回0
- 其他,都返回NaN