ECMAScript中的隱式轉換 == 會先將兩邊轉換成類似的類型,再執行比較;對象
①、若是有一個操做數是布爾值,則在比較相等性以前先將其轉換爲數值——false轉換爲0,而true轉換爲1;
②、若是一個操做數是字符串,另外一個操做數是數值,在比較相等性以前先將字符串轉換爲數值
③、若是一個操做數是對象,另外一個操做數不是,則調用對象的valueOf()方法,用獲得的基本類型值按照前面的規則進行比較,若是對象沒有valueOf()方法,則調用 toString();blog
順便提一下,valueOf() 方法可返回 Boolean 對象的原始值。[ ] 和 { } 都是屬於引用類型,js變量存儲有棧存儲和堆存儲,基本數據類型的變量存儲在棧中,引用數據類型的變量存儲在堆中,引用類型數據的地址存在棧中,當訪問基礎類型變量時,直接從棧中取值。當訪問引用類型變量時,先從棧中讀取地址,在根據地址到堆中取出數據;ip
如今看看 [ ]==![ ] 的結果爲true:字符串
(1)根據運算符優先級 ,! 的優先級是大於 == 的,因此先會執行 ![ ] ;!可將變量轉換成boolean類型,null、undefined、NaN以及空字符串('')取反都爲true,其他都爲false。因此 ! [ ] 運算後的結果就是 false,也就是 [ ] == ! [ ] 至關於 [ ] == false;基礎
(2)根據上面的規則① ,[ ] ==![ ]至關於 [ ] == 0;變量
(3)根據上面的規則③,[ ].toString() = ' ' (空字符串);數據類型
(4)根據上面的規則②,空字符串轉爲數值爲0,因此 [ ] == ![ ] 至關於 0=0,結果爲true。引用
總結一下:方法
[ ] ==![ ] --> [ ] == false --> [ ] ==0 --> ' ' == 0 --> 0==0 --> true;im
對於{ } ==!{ }也是同理的,關鍵在於{ }.toString() --> 結果爲NaN, NaN==0 --> false;
那麼同理,
對於 [ ]==!{ } 結果爲true;{ }==![ ] 接果爲false 就很容易理解了。