2012-12-13 6 views

Odpowiedz

9

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ż ==.

+0

Najbardziej dobrze wyjaśniona odpowiedź, dzięki – rickyduck

4

Wszystko przykład spowodować false można łatwo wytłumaczyć faktem, że w przypadku porównywania obiektów (i tablice są specjalne przedmioty), JavaScript będzie porównaj referencje obiektu. Podczas tworzenia nowych obiektów z tymi wszystkimi porównaniami wszystkie będą wskazywać na różne obiekty, stąd wynik będzie następujący: false.

Co do [0]=='0': Gdy tylko jeden operand jest ciągiem, drugi zostanie również przekonwertowany na ciąg. Konwertowanie ciągów znaków [0] to '0', więc wynik jest prawdziwy.

To samo dotyczy jednego operandu będącego liczbą lub boolowcem, co wyjaśnia wyniki dwóch ostatnich porównań.

Więcej informacji można znaleźć na stronie respective MDN page.

Powołując się na ważną rolę:

równe (==)

Jeżeli oba argumenty nie są tego samego typu, JavaScript konwertuje argumentów następnie stosuje ścisłe porównanie. Jeśli jeden z operandów jest liczbą lub wartością logiczną, operandy są konwertowane na liczby, jeśli to możliwe; w przeciwnym wypadku, jeśli jeden z argumentów jest ciągiem, drugi operand jest konwertowany na łańcuch, jeśli to możliwe. Jeśli oba operandy są obiektami, to JavaScript porównuje wewnętrzne odniesienia, które są równe, gdy operandy odnoszą się do tego samego obiektu w pamięci.

3

Podczas korzystania z litteralowej inicjalizacji tablica/obiekt, nawet jeśli jest pusty, tworzy się nowy obiekt i jego odniesienie jest zwracane. Porównując je, porównujesz wartość referencji utworzonych obiektów.

Twoje inne przykłady zwracają wartość true, ponieważ porównujesz różne typy zmiennych, więc obiekty/tablice są transtypowane, aby być z nimi porównywalne.