Die logische Oder-Verknüpfung in JavaScript
Einführendes Beispiel
Die logische Und-Verknüpfung wertet die linke Seite aus und ergibt deren Wert, falls er wahrartig ist.
- Auswertung
'def' || 0
"def"
Ansonsten wertet sie die rechte Seite aus und ergibt den Wert der rechten Seite.
- Auswertung
0 || 14
14
Bezeichnung
Diese Oder-Verknüpfung wird als „logische Oder-Verknüpfung“ bezeichnet.
Sprechweisen
Der Operator »||« wird als „oder“ gesprochen, wenn es dabei verständlich wird, daß die logische Oder-Verknüpfung gemeint ist. Ansonsten muß eine ausführlichere Sprechweise wie „der logische Oder-Operator“ verwendet werden.
Schreibweisen
- JavaScript
||
In der Mathematik (Logik) und in der deutschen Sprache gibt es keine genaue Entsprechung dieser „logischen“ Und-Verknüpfung.
Morphologie
Der Operator »||« besteht aus einer Folge zweier senkrechter Striche »|«. Er stellt eine lexikalische Einheit dar, die nie von Leerraum umgeben sei muß und keinen Leerraum enthalten darf.
Syntax
Der Operator »||« ist ein binärer Infix-Operator.
Priorität
Die Priorität dieses Operators ist etwas kleiner als die von der logischen Und-Verknüpfung »&&«.
- Eigenschaften von Operatoren
A P A (A = Aritaet, P = Position, A = Assoziativitaet)
[Zirkumfix, Praefix, pOstfix, Infix, Sonstige]() 1 Z Eingeklammerter Ausdruck
() S Aufruf
+ - ! typeof delete 1 P Unaere vorangestellte Operatoren (Vorzeichen)
* / 2 I L "Punktrechnung": Multiplikation, Division
+ - 2 I L "Strichrechnung": Addition, Subtraktion
< 2 I L Kleiner
== != === !== 2 I L gleichartig, ungleichartig, gleich, ungleich
&& 2 I L logische Und-Verknuepfung
|| 2 I L logische Oder-Verknuepfung
?: 3 I R bedingte Auswertung
= ()=> 2 I R Zuweisung, Klammerpfeil
Assoziativitätsrichtung
Dieser Operator ist linksassoziativ.
Semantik
Die Semantik wurde schon weiter oben unter „Einführendes Beispiel“ beschrieben.
Einfache Beispiele
Die folgenden Beispiele werten nur die linke Seite aus, da sie wahrartig ist. Sie haben dann den Wert der linken Seite.
- Auswertung
7.2 || 22
7.2
- Auswertung
true || 'abc'
true
- Auswertung
true || false
true
- Auswertung
true || true
true
- Auswertung
true || console.log( "log" )
true
Die folgenden Beispiele werten erst die linke Seite und dann die rechte Seite aus, da die linke Seite falschartig ist. Sie haben dann den Wert der rechten Seite.
- Auswertung
undefined || 7
7
- Auswertung
NaN || false
false
- Auswertung
'' || 'abc'
"abc"
- Auswertung
false || true
true
- Auswertung
false || false
false
- Auswertung
false || console.log( "log" )
log
undefined
Weitere Beispiele
Oder-Kaskaden (Oder-Sequenz)
Eine Kaskade von Oder-Ausdrücken ergibt den ersten Wert, der wahrartig ist, oder den letzten Wert, falls keiner falschartig ist.
Die Kaskade bedeutet dasselbe wie der darunterstehende Ausdruck mit Klammern. (Die Oder-Verknüpfung ist linksassoziativ.)
- Auswertungen
false || 0 || 7
7
( false || 0 )|| 7
7
false || 0
0
( 0 )|| 7
7
- Auswertungen
true || 0 || 7
true
( true || 0 )|| 7
true
true || 0
true
( true )|| 7
true
- Auswertungen
false || 1 || 7
1
( false || 1 )|| 7
1
false || 1
1
( 1 )|| 7
1
Wirkungen
Die Definition von Funktionen durch den Programmierer erlaubt es, Auswertung von Ausdrücken zu verfolgen.
- Auswertungen
p = x =>{ console.log( i, x ); i = i + 1; return x; }
i = 0
p( true )|| p( false )0 true
true
i = 0
p( false )|| p( true )0 false
1 true
true
i = 0
p( false )|| p( false )|| p( false )|| p( true )|| p( true )|| p( true )0 false
1 false
2 false
3 true
true
Anwendungsbeispiele
Wächter
Die linke Seite kann als „Wächter“ fungieren, der die Ausführung der rechten Seite nur dann gestattet, wenn er falschartig ist.
Dies ähnelt einem ternären Operator, aber der alternative Zweig (für den Fall, daß der ersten Ausdruck falschartig ist) entfällt hier (wie ein einer if-Anweisung).
- Auswertungen
p = x =>{ console.log( i, x ); i = i + 1; return x; }
i = 0
true || p( 'ausgefuehrt' )true
i = 0
false || p( 'ausgefuehrt' )1 ausgefuehrt
1
Versuchssequenz
Unter einem „Versuch“ verstehen wir hier eine Funktion, die versucht, eine Aufgabe zu erledigen, und einen falschartigen Wert genau dann zurückgibt, wenn der Versuch gescheitert ist.
Wenn verschiedene Versuche hintereinander erfolgen sollen, bis einer von ihnen zum Erfolg führt, kann eine Oder-Sequenz für die Aufrufe verwendet werden.
- Beispiel
ErgebnisImSpeicherSuchen() ||
ErgebnisAufFestplatteSuchen() ||
ErgebnisNeuBerechnen()
Das Ergebnis soll nur dann auf der Festplatte gesucht werden, wenn es nicht schon im Speicher gefunden wurde. Erst, wenn beide Versuche gescheitert sind, dann soll eine aufwendige Neuberechnung des Ergebnisses gestartet werden.
Zusammengesetzte Aussagen
Eine Oder-Verknüpfung kann verwendet werden, um eine Disjunktion (eine Oder-Aussage) zu schreiben.
- Auswertungen
plus_oder_minus_10 =( x )=>{ return x === 10 || x === -10; }
function plus_oder_minus_10()
plus_oder_minus_10( -11 )
false
plus_oder_minus_10( -10 )
true
plus_oder_minus_10( -9 )
false
plus_oder_minus_10( 9 )
false
plus_oder_minus_10( 10 )
true
plus_oder_minus_10( 11 )
false
Vermeiden einer Division durch 0
Mit der Oder-Verknüpfung kann eine Funktion geschrieben werden, die den Kehrwert einer Zahl oder »true« zurückgibt. »true« wird zurückgegeben, wenn die Zahl gleich »0« ist, weil dann eine Berechnung des Kehrwerts nicht möglich ist.
- Auswertungen
kehrwert_oder_false =( x )=>{ return x == 0 || 1/x; }
kehrwert_oder_false( 2 )
0.5
kehrwert_oder_false( 0 )
true
Eine alternative Implementation mit dem ternären Operator:
- Auswertungen
kehrwert_oder_false =( x )=>{ return x == 0 ? true : 1/x; }
Erkennung von Verzeichnissen
Unter einer Funktion, die eine bestimmte Art von Dingen „erkennt “ verstehen wir hier eine Funktion, die genau dann einen wahrartigen Wert ergib, wenn sie mit einem Argument aufgerufen wird, das zu jener Art von Dingen gehört.
Unter einem Verzeichnis verstehen wir hier einen Wert, der Einträge enthält, wie früher im Kurs schon behandelt.
Mit der Oder-Verknüpfung »||« kann eine Funktion geschrieben werden, die ein Verzeichnis erkennt.
- Funktionsdefinition
isDirectory =( ( x )=> typeof x === "object" || typeof x === "function" )&& x !== null
Fehlwerte
Die Oder-Operation kann verwendet werden, um das Verhalten einer Funktion beim Fehlen eines Argumentes zu implementieren.
Die im folgenden definierte Funktion »f« soll für den Fall, daß kein Argument übergeben wurde, »12« ergeben, und sonst den Argumentwert.
- Funktionsdefinition
f = x => x || 12
function f()
Einige Aufrufe bestätigen dieses Verhalten auch.
- Protokoll
f( 5 )
5
f()
12
Bei einem Aufruf ohne Argumen erhält der Parameter den Wert »undefined«, welcher als falschartig gilt.
Jedoch ergibt sich der Fehlwert »12« auch bei einem Aufruf mit dem Argumentwert »0«, da dieser ebenfalls als falschartig gilt!
- Protokoll
f( 0 )
12
Daher kann man die logische Oder-Operation nur wie oben nutzen, wenn es akzeptabel ist, daß sich das Verhalten für den Fall eines „fehlenden Wertes“ auch bei anderen falschartigen Werten zeigt. Ansonsten wäre die folgende Implementation etwas sicherer.
- Funktionsdefinition
f = x => x !== undefined ? x : 12
function f()
- Protokoll
f( 5 )
5
f()
12
f( 0 )
0
f( undefined )
12
Diese Funktion kann zwar auch nicht erkennen, ob sie ohne Argumente oder mit dem Argumentwert »undefined« aufgerufen wurde, aber dies ist in vielen Fällen bereits akzeptabel.
Bemerkung Im Deutschen wird das Wort oder ganz ähnlich wie in »x || 12« verwendet, wenn man etwa sagt „Entweder kriege ich mehr Geld oder ich kündige“, im Sinne von „wenn das falsch ist, dann …“.
.Übungsfragen
? Übungsfrage
- Skript (Auszug)
(window.getSelection&&window.getSelection())||(document.getSelection&&document.getSelection())
In einem längeren Skript entdecken Sie den obenstehenden Quelltext. Welche Absicht könnte der Autor damit verfolgt haben?
? Übungsfrage
- Skript (Auszug)
var requestMethod = el.requestFullScreen || el.webkitRequestFullScreen|| el.mozRequestFullScreen || el.msRequestFullScreen;
if (requestMethod)requestMethod.call(el);
In einem längeren Skript entdecken Sie den obenstehenden Quelltext. Welche Absicht könnte der Autor damit verfolgt haben?