JavaScript: Boolesche Operatoren für nicht boolesche Operanden, wie funktioniert das?

2 Antworten

Angenommen, du hast zwei boolsche Ausdrücke, die du via && verbindest. Der Einfachkeit halber verwende ich folgend nur zwei boolsche Variablen:

let expression1 = // true or false
let expression2 = // true or false
let result = expression1 && expression2;

Damit das Ergebnis auf den Wert true kommt, müssten beide Ausdrücke den Wert true haben.

true + true = true
true + false = false
false + true = false
false + false = false

Das bedeutet, wenn expression1 nach Auswertung false ergibt, bräuchte der zweite Ausdruck nicht noch evaluiert werden, denn das Gesamtergebnis wäre bereits klar (false). Diesen Aufwand erspart sich der Computer bei Nutzung des &&-Operators auch.

In der Praxis findet man verschiedene Anwendungsfälle, bei denen das vorteilhaft ist. Grundsätzlich geht es darum, dass der zweite Ausdruck nicht ausgewertet wird, wenn der erste Ausdruck bereits false ist.

function printName(dog) { 
  if (dog && dog.hasOwnProperty("name")) {
    console.log(`I am ${dog.name}.`);
  }
}

let dog = { name: "Odie" };
printName(dog);
let otherDog = null;
printName(otherDog)

In diesem Beispiel gibt es nur eine Ausgabe, wenn das Objekt existiert und ein bestimmtes Property hat. Würde der &&-Operator stets auch den zweiten Ausdruck auswerten, würde dies beim Aufuf mit otherDog zu einem Laufzeitfehler führen, da ein null-Objekt keine hasOwnProperty-Methode kennt.

Noch ein anderer praktischer Fall:

let dog = { name: "Odie" };

if (dog) {
  console.log(dog.name);
}

// shorter:  
dog && console.log(dog.name);

Die kurze Version funktioniert, da beide Ausdrücke Werte zurückgeben, die sich zu true/false auswerten lassen (in JavaScript kann jedes Element logisch ausgewertet werden, man spricht von truthy/falsy-Werten). Grundsätzlich wird jedes Element als true betrachtet, wenn es weder false, 0, "", null, undefined oder NaN zurückgibt.

Uglifier konvertieren oftmals Abfragen in boolsche Ausdrücke um, denn sie sind kürzer.


Shellux 
Fragesteller
 03.06.2022, 17:32

Vielen Dank!

0

Verstehe die Frage denke ich Falsch

varString1 = True

varString2 = True

if (varString1 && varString2) {

return True

} else {

return False

}