[]==![] 為什麽等於true?
阿新 • • 發佈:2017-07-20
false 運算符 value logs span img 操作 檢查 但是 在比較時,該運算符還遵守下列規則:
值 null 和 undefined 相等。
在檢查相等性時,不能把 null 和 undefined 轉換成其他值。
如果某個運算數是 NaN,等號將返回 false,非等號將返回 true。
如果兩個運算數都是對象,那麽比較的是它們的引用值。如果兩個運算數指向同一對象,那麽等號返回 true,否則兩個運算數不等。
最近碰到這樣一個問題:
[]==![] 為什麽等於true?
首先分析 !的優先級較==高,先運算==兩側的操作數:
typeof []; //"object" typeof ![]; //"boolean"
執行類型轉換的規則如下:
如果一個運算數是 Boolean 值,在檢查相等性之前,把它轉換成數字值。false 轉換成 0,true 為 1。
如果一個運算數是字符串,另一個是數字,在檢查相等性之前,要嘗試把字符串轉換成數字。
如果一個運算數是對象,另一個是字符串,在檢查相等性之前,要嘗試把對象轉換成字符串。
如果一個運算數是對象,另一個是數字,在檢查相等性之前,要嘗試把對象轉換成數字。
值 null 和 undefined 相等。
在檢查相等性時,不能把 null 和 undefined 轉換成其他值。
如果某個運算數是 NaN,等號將返回 false,非等號將返回 true。
如果兩個運算數都是對象,那麽比較的是它們的引用值。如果兩個運算數指向同一對象,那麽等號返回 true,否則兩個運算數不等。
回到最開始的題目:
== 的左操作數是[],數組(對象處了日期對象,都是對象到數字的轉換),碰到==要先調用自己的valueOf()方法=>[](還是本身),然後調用自己的toString()方法=>空字符串=>false (或者空字符串轉成0,然後再轉成false,但是終歸會是false)
==右側側的操作數 ![]:[]是對象,會轉換成true,然後再轉成false(加!的一定是轉換成boolean)
所以,最後 flase==false //true
[]==![] 為什麽等於true?