[] == ![]涉及的運算符及類型轉換

[] == ![];
// true

一個簡單的運算,一共涉及了:運算符優先級,boolean類型的轉換,相等運算符的比較邏輯,數值的轉換邏輯所以還是蠻經典的

  1. 圓括號()
  2. 成員訪問.
  3. 後置遞增|後置遞減++|--
  4. 邏輯非,一元加,一元減,前置遞增,前置遞減
  5. 乘法,除法,取模
  6. 加法,減法
  7. 大於,大於等於,小於,小於等於
  8. 等號,非等號,全等
  9. 邏輯與... && ...
  10. 邏輯或... || ...
  11. 條件運算法... ? ... : ...
  12. 賦值=

首先,是根據運算符優先級來確定運算順序。根據上面列出的常用運算符的優先級,可得出會先運算等號左邊的。

  1. 只有null, undefined,""(空字符串),0NaN轉化爲false(這些類型叫假值)。所以[]轉化爲true
  2. !邏輯非操作符首先會將它的操作數轉換爲一個布爾值,然後再對其取反
  3. !!兩個邏輯非,作用域Boolean()轉型函數行爲相同
  4. &&如果左側爲真值,則返回右側值.如果左側爲假值,則返回左側的值
  5. ||如果左側爲真值,則返回左側值.否則返回右側值

邏輯非會先把變量轉化爲boolean值,再對他做非運算。所以這裏考查,boolean類型的轉換,根據上面所以最終會把![]轉化爲false

  1. 如果兩個操作數類型相同,用嚴格比較,
  2. 如果一個是null,另一個是undefined。則相等
  3. 如果一個是數字,另一個是字符串。則把字符串轉化爲數字,然後比較
  4. 如果一個是boolean值。則先將其轉爲數字。true1false0
  5. 如果一個是Object,另一個是數字或字符串。則讓把Object轉化爲原始值,再比較。JS先嚐試用valueOf()轉化。再嘗試用toString()轉化。再比較([].toString''(空字符串),空字符再變爲0。所以[]==''==0; ![] == !true == false == 0(boolean值先轉爲數字)

所以會先把false轉換爲數字類型的0。然後再把[]使用toString()把[]轉爲''

  1. Booean值,true1,false0
  2. null,返回0
  3. undefined,返回NaN
  4. 對象,先調用ValueOf(),如果是NaN,再調用toString()
  5. 字符串

  • 只包含數字(浮點字符)(包括以正負號開頭),則轉化爲10進制數值(浮點數值)。數字後有其他字符都不行!
  • 只包含有效的十六進制格式,被轉化爲16進制
  • 空字符串,返回0
  • 其他,都返回NaN

最終會把[]轉化爲0,所以0 == 0





發佈了55 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章