javascript為什么console.log ([] == ![]) 結果為true?console.log([] == null); //falseconsole.log(Boolean([])); //trueconsole.log(![]); // falseconsole.log(![] == ![]); //trueconsole.log([] == []); //false究竟這個比的機制是怎么樣的呢, 不應該是 ![]為false , 就變成了 [] == false,那么[]不應該隱式轉換為true嗎? 這樣不就變成了 true == false 結果應該為false???問題得到了本質上的解決,感謝一位朋友分享的知乎文章。原因是:作者:Belleve鏈接:https://www.zhihu.com/questio...來源:知乎著作權歸作者所有,轉載請聯系作者獲得授權。首先,== 的定義是:GetValue 會獲取一個子表達式的值(消除掉左值引用),在表達式 [] == ![] 中,[] 的結果就是一個空數組的引用,而 ![] 就有意思了,它會按照 11.4.9 和 9.2 節的要求得到 false。比較的行為在 11.9.3 節里,所以翻到 11.9.3:在這段算法里,和「[] == ![]」匹配的是條件 7,所以會遞歸地調用「[] == ToNumber(false)」進行比較。在 9.3 節中定義了 ToNumber 原語,ToNumber(false) 等于 0,于是比較變為「[] == 0」。在此處因為 [] 是對象,比較過程走分支 9,依「ToPrimitive([]) == 0」比較。ToPrimitive 默認是調用 toString 方法的(依 8.2.8),于是 ToPrimitice([]) 等于空字符串。結果,[] == ![] 的比較最后落到了 ''==false 上,按照 11.9.3 中的定義會依分支 5 比較 「ToNumber('')==0」,ToNumber('') 依 9.3.1 等于 0,所以結果為 true。
JavaScript為什么console.log ([] == ![]) 結果為true?
料青山看我應如是
2018-09-03 17:09:46
