Ich habe erwartet, dass der folgende Vergleich einen Fehler ergibt:
%Vor% aber seltsamerweise gibt es false
zurück.
Noch seltsamer,
%Vor% gibt true
zurück.
Wie funktioniert dieser "ternäre" Vergleich?
Zuerst müssen wir verstehen, dass ein ==
Vergleich zwischen einer Zahl und einem booleschen Wert zu einer internen Typumwandlung des booleschen Wertes in eine Zahl führt ( true
wird 1
und false
wird 0
)
Der von Ihnen angezeigte Ausdruck wird von links nach rechts ausgewertet. Also, zuerst
%Vor% wird ausgewertet und das Ergebnis ist true
und Sie vergleichen true
mit 0. Da true
während des Vergleichs 1
wird, wird 1 == 0
zu false
ausgewertet. Aber wenn du sagst
A == B
ist true
, was im Vergleich mit der Zahl 1
wird und Sie vergleichen das wieder mit 1. Deshalb gibt es true
aus.
Zuweisungsoperatoren wie = sind rechtsassoziativ : Wenn eine Reihe dieser Operatoren die gleiche Priorität hat, werden sie von rechts nach links verarbeitet, sodass A = B = 0
als% verarbeitet wird. co_de% ( A = (B = 0)
gibt 0 zurück, also enden sowohl A als auch B als 0).
Gleichheitsoperatoren wie == sind linksassoziativ : Operatoren mit gleichem Vorrang werden von links nach rechts verarbeitet. B = 0
wird als A == B == 0
verarbeitet, und da (A == B) == 0
wahr (1) ist, wird A == B
, was falsch (0) ist.
Ebenso wird 1 == 0
als A == B == 1
verarbeitet, was (A == B) == 1
wird, was wahr (1) ist.
Quelle und weitere Informationen: Ссылка
Zuerst prüft es Ihre Klausel auf A == B, was wahr ist, als es beginnt, true == 0 zu prüfen, und 0 ist falsch. Wenn Sie also A == B == 1 überprüfen, überprüfen Sie A == B, was wahr ist, und true == 1. Also wird true zurückgegeben. Wenn Sie wirklich alle Möglichkeiten prüfen möchten, sollten Sie so etwas tun:
%Vor%Sie können von links nach rechts arbeiten. In diesem Fall überprüfen Sie zuerst, ob A == B, dann prüfen Sie, ob dies gleich 0 ist. Also, da A == B, ist dies wahr. Jetzt wird es (wahr == 0), was falsch ist. Wenn A = 1, B = 2, dann würde (A == B == 0) wahr ergeben! Dies liegt daran, dass A == B falsch ist und (falsch == 0) wahr ist!
Tags und Links javascript comparison truthiness