Wynika to z niezrozumiałych reguł, w jaki sposób javascript stosuje przymus. Możesz przeczytać o tym w §11.9.3 specyfikacji EcmaScript 5.
Dwa obiekty (które tablice są zbyt) nigdy nie są równe, zatem wszystkie porównania w pierwszym plastyczności blok fałszywej (§11.9.3.1.c.vi)
Drugi blok jest trudniejsze:
Po pierwsze, należy wiedzieć, że ==
używa typu przymusu do porównywania argumentów.
W przypadku, gdy w wyniku porównania wystąpiła wartość logiczna, ta pierwsza jest wymuszona na liczbę.
[]==false
[]==0
po że przedmioty są zmuszane do swoich pierwotnych wartości wywołując Object.prototype.toString
"" == 0
Następnie łańcuch jest coereced się do szeregu (""
się 0
)
0 == 0
otrzymując prawdziwe. Stosując te same reguły, możesz zobaczyć, dlaczego Twoje inne przykłady również są prawdziwe.
Należy pamiętać, że ===
nigdy nie powoduje przymusu typowego, ale najpierw sprawdza poprawność typów i podaje wartość false, jeśli nie są one równe! Tylko jeśli typy są równe, porównuje rzeczywiste wartości. Tak więc ta metoda porównania jest znacznie bardziej niezawodna niż ==
.
Najbardziej dobrze wyjaśniona odpowiedź, dzięki – rickyduck