Die Verzweigung in JavaScript
Die Syntax der Verzweigung
Die Syntax der Verzweigung beginnt wie die Syntax der schon behandelten bedingten Auswertung, nur daß dann noch eine mit dem Schlüsselwort »else« eingeführte Anweisung folgt.
- Bedingte Auswertung
Anweisung
.--. .-. .----------. .-. .-----------.
--->( if )--->( ( )--->| Ausdruck |--->( ) )--->| Anweisung |--->
'--' '-' '----------' '-' '-----------'- Verzweigung
Anweisung
.--. .-. .----------. .-. .-----------. .----. .-----------.
--->( if )--->( ( )--->| Ausdruck |--->( ) )--->| Anweisung |--->( else )--->| Anweisung |--->
'--' '-' '----------' '-' '-----------' '----' '-----------'
Die Semantik der Verzweigung
Wie bei der bedingten Auswertung wird zunächst der Ausdruck ausgewertet.
Falls der Wert des Ausdrucks als wahr gilt, so wird die Anweisung vor dem »else« ausgewertet, und der Wert der gesamten if-Anweisung ist dann der Wert jener Anweisung (oder »undefined«, falls die Anweisung keinen Wert produzierte). (Dies ist wie bei der bedingten Auswertung.)
Falls der Wert des Ausdrucks als falsch gilt, so wird die Anweisung hinter dem »else« ausgewertet, und der Wert der gesamten if-Anweisung ist dann der Wert jener Anweisung (oder »undefined«, falls die Anweisung keinen Wert produzierte).
Man bezeichnet jede der beiden Anweisungen auch als einen Zweig. Da bei jeder Auswertung der if-else-Anweisung nur einer der beiden Zweige ausgeführt wird, nennt man jene Anweisung auch eine Verzweigung.
Entsprechend der Bedeutung können wir auch die Bezeichnungen wie in dem folgenden Diagramm wählen.
- Verzweigung
Anweisung
.--. .-. .-----------. .-. .------------. .----. .-------------.
--->( if )--->( ( )--->| Bedingung |--->( ) )--->| Konsequenz |--->( else )--->| Alternative |--->
'--' '-' '-----------' '-' '------------' '----' '-------------'
Falls wir von der „if-Anweisung“ sprechen, so wird damit offengelassen, ob diese eine else-Klause beinhaltet.
Wir nennen Ausdrücke und Anweisungen, bei denen die Auswertung eines Ausdrucks oder einer Anweisung in Abhängigkeit von einem Wahrheitswert erfolgt (wie der ternäre Ausdruck und die if-Anweisung) auch Entscheidungsstrukturen.
Die Verzweigung bezeichnen wir auch als if-else-Anweisung.
Die if-else-Anweisung ähnelt dem ?-:-Operator, der wichtigste Unterschied besteht darin, daß die Konsequenz und die Alternative bei der if-else-Anweisung Anweisungen sind und beim ?-:-Operator Ausdrücke.
Lehrbücher verwenden die if-else-Anweisung etwas zu häufig. Oft kann ein Programmteil eleganter mit dem ?-:-Operator geschrieben werden. Die Autoren mancher Lehrbücher sind mit Sprachen groß geworden, in denen es keinen ?-:-Operator gab und sind diesen deshalb nicht gewohnt.
- Beispiel einer if-Anweisung
if( 0 )1; else 2;
- mögliche (nicht ganz) deutschsprachige Formulierung des Beispiels
- Wenn 0, dann 1, sonst 2.
Beispiele der Verzweigung
Beispiel
Im folgenden Beispiel wird »alpha« ausgegeben, weil das »true« die Auswertung der Anweisung vor dem »else« verlangt.
Danach wird »theta« ausgegeben, weil das »false« die Auswertung der Anweisung hinter dem »else« verlangt.
- Konsole
"use strict";
if( true )console.log( "alpha" ); else console.log( "gamma" );
if( false )console.log( "delta" ); else console.log( "theta" );alpha
theta
undefined
Beispiel (1)
Im folgenden Beispiel wird zunächst zweimal »undefinert« für den Wert der Aufrufe »schreibeKehrwert();« beziehungsweise »schreibeKehrwert( 0 );« ausgegeben. (In manchen Konsolen werden beide Ausgaben zu einer Ausgabe mit dem Faktor »2« zusammengefaßt.)
Es folgt »1« und »0.5« für den Wert der Aufrufe »schreibeKehrwert( 1 );« beziehungsweise »schreibeKehrwert( 2 );«.
Das »undefined« am Ende ist der Wert der gesamten eingegebenen Sequenz, bestimmte durch deren letzte Anweisung »schreibeKehrwert( 2 );«.
- Konsole
"use strict";
const schreibeKehrwert = n =>
{ if( n )console.log( 1/n );
else console.log( "undefiniert" ); }schreibeKehrwert();
schreibeKehrwert( 0 );
schreibeKehrwert( 1 );
schreibeKehrwert( 2 );undefiniert
undefiniert
1
0.5
undefined
Beispiel (2)
Das folgende Beispiel macht es sich zunutze, daß eine if-Anweisung einen Wert ergibt. Wenn dieser Wert als Ergebnis eines Aufrufs erscheinen soll, so ist jedoch die Verwendung von »eval« nötig.
- Konsole
"use strict";
const name = a =>
{ "use strict";
return eval
( "if( a === 0 )'Null'; else if( a === 1 )'Eins'; else 'Zwei';" ); }
console.log( name( 0 ));
console.log( name( 1 ));
console.log( name( 2 ));Null
Eins
Zwei
undefined
Wie in vielen Fällen läßt sich die Verzweigung hier gut durch einen ternären Ausdruck ersetzen.
- Konsole
"use strict";
const name = a =>
{ "use strict"; return a === 0 ? 'Null' : a === 1 ? 'Eins': 'Zwei'; }console.log( name( 0 ));
console.log( name( 1 ));
console.log( name( 2 ));Null
Eins
Zwei
undefined
Übungsfragen
? Übungsfrage
Welche Ausgabe erwarten Sie für die folgende Eingabe?
- Konsole
"use strict";
const name = a =>
{ "use strict";
let result;
if( a === 0 )result = "Null";
if( a === 1 )result = "Eins";
if( a === 2 )result = "Zwei";
if( a === 3 )result = "Drei";
else result = "Vier";
return result; };
console.log( name( 0 ));
console.log( name( 1 ));
console.log( name( 2 ));
console.log( name( 3 ));
console.log( name( 4 ));
? Übungsfrage
Welche Ausgabe erwarten Sie für die folgende Eingabe?
- Konsole
"use strict";
const zwei = a =>
{ "use strict";if( a = 2 )return "Zwei";
else return "Nicht Zwei"; }console.log( zwei( 2 ));
console.log( zwei( 0 ));
Übungsaufgaben
/ Schreiben einer if-Anweisung
Schreiben Sie eine if-Anweisung mit der Bedingung »f()«, der Konsequenz »console.log( "Ok." );« und der Alternative »return -1;«.
- Verzweigung
Anweisung
.--. .-. .-----------. .-. .------------. .----. .-------------.
--->( if )--->( ( )--->| Bedingung |--->( ) )--->| Konsequenz |--->( else )--->| Alternative |--->
'--' '-' '-----------' '-' '------------' '----' '-------------'
/ Übersetzung
Übersetzen Sie die (nicht ganz) deutschsprachige Formulierung „Wenn x, dann Rückgabe von 0, sonst Ausgabe des Wortes ‚Fehler‘. “ in eine if-Anweisung.
- Beispiel einer if-Anweisung
if( 0 )1; else 2;
- mögliche (nicht ganz) deutschsprachige Formulierung des Beispiels
- Wenn 0, dann 1, sonst 2.
Vergleich mit dem ternären Ausdruck *
Man kann sagen, daß die folgende Verzweigung (mit einem Ausdruck »E « und Anweisungen »S « und »T «) in vielen Fällen dem darunterstehenden ternären Ausdruck entspricht.
- Verzweigung
- { if( E )S else T }
- ternärer Ausdruck
- {( E )? eval( "S " ): eval( "T " ); }
Umgekehrt kann man den folgenden ternären Ausdruck in vielen Fällen als die darunterstehende Verzweigung schreiben (dabei sind »A « und »B « Ausdrücke).
- ternärer Ausdruck
- (( E )?( A ):( B ))
- Verzweigung
- eval( "if( E )A ; else B ;" )
Beim ternären Ausdruck sind die Konsequenz und die Alternative Ausdrücke, bei der Verzweigung Anweisungen.