Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 100

4.10.1Logisches UND (&&)

Оглавление

Der Operator && kann auf drei verschiedenen Ebenen betrachtet werden. Auf der einfachsten Stufe, wenn er mit booleschen Operanden verwendet wird, führt && einfach eine logische UND-Operation auf beiden Werten durch. Der Operator liefert nur dann true, wenn der erste und der zweite Operand wahr sind. Ist einer oder sind beide Operanden false, wird false zurückgegeben.

&& wird häufig zum Verbinden zweier relationaler Ausdrücke genutzt:

x === 0 && y === 0 // true nur und nur dann, wenn x und y beide 0 sind.

Da relationale Ausdrücke immer zu true oder false ausgewertet werden, liefert auch der Operator selbst true oder false, wenn er auf diese Weise verwendet wird. Relationale Operatoren haben einen höheren Vorrang als && (und ||) – Ausdrücke wie x === 0 && y === 0 können also problemlos ohne Klammern geschrieben werden.

Aber bei && müssen die Operanden nicht unbedingt boolesche Werte sein. Erinnern Sie sich einfach daran, dass alle JavaScript-Werte entweder truthy oder falsy sind. (Einzelheiten dazu finden Sie in 3.4. Die falsy-Werte sind false, null, undefined, 0, -0, NaN und "". Alle anderen Werte einschließlich aller Objekte sind truthy.) In zweiter Hinsicht kann && als UND-Operator für solche nicht-strikt wahren und falschen Werte verstanden werden. Sind beide Operanden truthy, liefert der Operator einen truthy-Wert. Andernfalls – d.h., wenn mindestens einer der Operanden ein falsy-Wert ist – liefert er einen falsy-Wert. In JavaScript können alle Ausdrücke oder Anweisungen, die einen booleschen Wert erwarten, mit nicht-strikt wahren und falschen Werten umgehen. Deswegen führt es in der Praxis zu keinerlei Problemen, dass && nicht immer true oder false liefert.

Die obige Beschreibung besagt übrigens, dass der Operator zwar einen »irgendwie wahren« Wert oder einen »irgendwie falschen« Wert liefert, aber nicht angibt, welcher Wert es genau ist. Dazu müssen wir && in dritter und letzter Hinsicht beschreiben. Der Operator beginnt bei der Auswertung mit dem ersten Operanden, dem Ausdruck auf der linken Seite. Ist der Wert dieses Operanden falsy, muss auch der Wert des gesamten Ausdrucks ein falsy-Wert sein. && liefert deswegen einfach den Wert auf der linken Seite und wertet den Ausdruck auf der rechten Seite nicht einmal mehr aus.

Ist der Wert auf der linken Seite hingegen ein truthy-Wert, hängt der Wert des gesamten Ausdrucks vom Wert auf der rechten Seite ab. Ist der Wert auf der rechten Seite ebenfalls ein truthy-Wert, ist auch der gesamte Ausdruck ein truthy-Wert. Ist der Wert auf der linken Seite dagegen ein falsy-Wert, ist auch der gesamte Ausdruck falsy. Wenn der Wert auf der linken Seite also ein truthy-Wert ist, wertet der Operator einfach den Wert auf der rechten Seite aus und liefert ihn zurück:

let o = {x: 1};

let p = null;

o && o.x // => 1: o ist truthy, es wird also der Wert von o.x geliefert.

p && p.x // => null: p ist falsy, also gib p zurück; p.x wird nicht mehr

// ausgewertet.

Entscheidend dabei ist, dass der Operand auf der rechten Seite von && manchmal ausgewertet wird und manchmal nicht. In diesem Codebeispiel hatte die Variable p den Wert null. Der Ausdruck p.x hätte, wäre er ausgewertet worden, zu einem TypeError geführt. Aber der Code nutzt && auf idiomatische Weise derart, dass p.x nur ausgewertet wird, wenn p truthy ist – und damit niemals null oder undefined.

Das Verhalten von && wird gelegentlich als »kurzschließend« bezeichnet (dieses Konzept eines vorzeitigen Abbruchs einer Auswertung ist uns bereits bei bedingten Eigenschaftszugriffen und bedingten Aufrufen begegnet), und Sie können gelegentlich auf Code stoßen, der es absichtlich einsetzt, damit Code nur bedingt ausgeführt wird. Die folgenden beiden Codezeilen haben beispielsweise die gleiche Wirkung:

if (a === b) stop(); // stop() nur aufrufen, wenn a === b.

(a === b) && stop(); // Macht das Gleiche.

Im Allgemeinen sollten Sie aufpassen, wenn Sie auf der rechten Seite von && Ausdrücke mit möglichen Seiteneffekten einsetzen (Zuweisungen, Inkremente, Dekremente, Funktionsaufrufe). Ob diese Seiteneffekte eintreten, hängt vom Wert auf der linken Seite ab.

Trotz der recht komplexen Funktionsweise dieses Operators wird er am häufigsten als einfacher logischer Operator benutzt, der mit truthy- und falsy-Werten umgehen kann.

JavaScript  –  Das Handbuch für die Praxis

Подняться наверх