Die logische Oder-Verknüpfung in JavaScript (Die logische Oder-Verknüpfung in JavaScript), Lektion, Seite 724135
https://www.purl.org/stefan_ram/pub/oder_javascript (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
JavaScript-Kurs

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?

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724135 stefan_ram:724135 Die logische Oder-Verknüpfung in JavaScript Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724135, slrprddef724135, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/oder_javascript