Der ternäre Operator in JavaScript
Die Syntax
Der ternäre Operator hat drei Operanden. Wir nennen ihn auch ?-:-Operator.
- Syntaxdiagramm (vereinfacht)
Ausdruck
.----------. .-. .----------. .-. .----------.
--->| Ausdruck |--->( ? )--->| Ausdruck |--->( : )--->| Ausdruck |--->
'----------' '-' '----------' '-' '----------'
Einen Operator mit drei Operanden nennt man auch einen ternären Operator. Da es in JavaScript nur einen ternären Operator gibt, nennt man ihn auch den ternären Operator. Eine Anwendung jenes Operators ist ein Ausdruck, der nur aus jenem Operator und seinen Operanden besteht – wir nennen solch eine Anwendung auch einen ternären Ausdruck.
Die Priorität
Man kann die Vorrangregeln eines ternären Operators nicht immer durch eine einfache Priorität ausdrücken. Aber etwas vereinfacht gesagt ist die Priorität des ternären Operators so, daß sie ungefähr mit der Priorität eines Zuweisungsoperators vergleichbar ist.
Wenn ein ternärer Ausdruck auf der rechten Seite einer Zuweisung vorkommt, so ist seine Priorität etwas stärker als die der Zuweisung, aber in Bezug auf die beiden letzten Operanden ist sie etwas schwächer, so daß dort Zuweisungen stehen dürfen, ohne daß sie eingeklammert werden müssen. Das folgende Beispiel hat also dieselbe Bedeutung wie die darunterstehende Schreibweise mit Klammern.
- Beispiel
x = 2 ? y = 3 : z = 4
x =( 2 ?( y = 3 ):( z = 4 ));
Im Zweifelsfall setze man Klammern.
- Eigenschaften von Operatoren
A P A (A = Aritaet, P = Position [Zirkumfix, Praefix, Infix, sonstige], A = Assoziativitaet)
() 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 Gleichheit, Ungleichheit
?: 3 I R bedingte Auswertung
= ()=> 2 I R Zuweisung, Klammerpfeil
Die Semantik
Der ternäre Operator wertet zuerst seinen ersten Operanden, links vom Fragezeichen, aus.
Wenn der sich ergebende Wert als wahr gilt, so wird der Ausdruck links vom Doppelpunkt ausgewertet, und der Ausdruck rechts vom Doppelpunkt wird nicht ausgewertet, andernfalls wird der Ausdruck rechts vom Doppelpunkt ausgewertet, und der Ausdruck links vom Doppelpunkt wird nicht ausgewertet.
Daher nennen wir den Ausdruck vor dem Fragezeichen auch Bedingung, den Ausdruck links vom Doppelpunkt Konsequenz und den Ausdruck rechts vom Doppelpunkt Alternative.
- Syntaxdiagramm (vereinfacht)
Ausdruck
.-----------. .-. .------------. .-. .-------------.
--->| Bedingung |--->( ? )--->| Konsequenz |--->( : )--->| Alternative |--->
'-----------' '-' '------------' '-' '-------------'
Der Wert des ganzen Ausdrucks ist dann der Wert der letzten Auswertung.
- Beispiel eines ternären Ausdrucks
b ? x : y
- Sinngemäße Wiedergabe des Beispielausdrucks auf deutsch
- wenn b, dann x, sonst y
- Wörtliche Wiedergabe des Beispielausdrucks auf deutsch
- b, Fragezeichen, x, Doppelpunkt, y
Beispiel Die Auswertung der Bedingung
- Auswertung
console.log( "a" )? 1 : 2
a
2
Beispiel Die Wahl eines Wertes
- Auswertung
0 ? 1 : 2
2
- Auswertung
1 ? 2 : 3
2
Beispiel Die Wahl einer Wirkung
- Auswertung
console.log( "a" )? console.log( "b" ): console.log( "c" )
a
c
undefined
- Auswertung
true ? console.log( "a" ): console.log( "b" );
a
undefined
- Auswertung
false ? console.log( "a" ): console.log( "b" );
b
undefined
Beispiel Ein Glücksspiel
- Auswertung
Math.random() < 0.1 ? "gewonnen" : "verloren"
"verloren"
- Auswertung
Math.random() < 0.1 ? "gewonnen" : "verloren"
"gewonnen"
Beispiel Der Kehrwert
- Auswertung
1/0
Infinity
- Auswertung
const kehrwert = x => x ? 1/x : undefined;
undefined
- Auswertung
kehrwert( 1 )
1
- Auswertung
kehrwert( 0 )
undefined
Im letzten Beispiel liegt für den Kehrwert von »0« »NaN« nahe, doch da im Mathematikunterricht immer erklärt wird, daß der Kehrwert von »0« undefiniert ist, drängt sich die Verwendung von »undefined« hier als mathematisch korrekt auf.
Beispiel Verschachtelungen des ternären Operators
Im folgenden Beispiel werden mehrere ternäre Operator ineinander verschachtelt.
Bei der folgenden Verschachtelung ist jeweils der dritte Operand eines ternären Operators wieder ein ternärer Ausdruck. Dadurch ist die Verschachtelung effektiv eine einfache lineare Folge von Entscheidungen: Wann immer
- Auswertung
const deutsch = x =>
x === 0 ? "Null" :
x === 1 ? "Eins" :
x === 2 ? "Zwei" :
x === 3 ? "Drei" : undefined;undefined
- Auswertung
deutsch( 1 )
"Eins"
Beispiel Auswahl einer Funktion
Im folgenden Beispiel wird ein ternärer Operator verwendet, um eine Funktion auszuwählen.
- Auswertung
( 0 ? Math.max : Math.min )( 1, 2, 3 )
1
- Auswertung
( 1 ? Math.max : Math.min )( 1, 2, 3 )
3
Wir könne auf diese Weise eine Funktion »m« definieren, die eine Funktion ergibt, welche das Minimum oder das Maximum berechnet, je nachdem ob das Argument jener Funktion »m« »0« beziehungsweise »1« ist.
- Auswertung
m = x =>( x ? Math.max : Math.min )
function m()
- Auswertung
m( 0 )( 1, 2, 3 )
1
- Auswertung
m( 1 )( 1, 2, 3 )
3
Übungsfragen
? Übungsfrage
Welchen Wert hat »0 ? 1 : 2«?
? Übungsfrage
Welchen Wert hat »2 ? 1 : 0«?
? Übungsfrage
Welchen Wert hat »true ? false : true«?
? Übungsfrage
Welchen Wert hat »"a" ? "b" : "c"«?
Übungsaufgaben
Diese Übungsaufgaben sollten möglichst ohne Vorgriffe, also mit dem bisher behandelten Sprachelementen gelöst werden.
/ Schreiben eines ternären Ausdrucks
Schreiben Sie einen ternären Ausdruck mit der Bedingung »x«, der Konsequenz »f()« und der Alternative »2«.
- Syntaxdiagramm (vereinfacht)
Ausdruck
.-----------. .-. .------------. .-. .-------------.
--->| Bedingung |--->( ? )--->| Konsequenz |--->( : )--->| Alternative |--->
'-----------' '-' '------------' '-' '-------------'
/ Übersetzung
Übersetzen Sie die deutschsprachige Formulierung „Wenn f von 2, dann 1, sonst 0 “ in einen ternären Ausdruck.
- Beispiel eines ternären Ausdrucks
b ? x : y
- Sinngemäße Wiedergabe des Beispielausdrucks auf deutsch
- wenn b, dann x, sonst y
/ Die Negation
Definieren Sie eine Funktion, die »false« ergibt, falls ihr Argumentwert als wahr gilt und »true« sonst. Verwenden Sie dazu den ternären Operator.
/ Eine willkürliche Funktion
Schreiben Sie eine Funktion, die 17 ergibt, falls ihr Argumentwert 0 ist, und sonst 12.
/ Eine willkürliche Funktion (1)
Schreiben Sie eine Funktion, die 17 ausgibt, falls ihr Argumentwert 0 ist, und sonst 12. Verwenden Sie dazu die Lösung der vorigen Übungsaufgabe, ohne diese zu verändern.
/ Eine willkürliche Funktion (2)
Schreiben Sie eine Funktion, die 17 ergibt, falls ihr Argumentwert 7 ist, und sonst 12.
/ Eine willkürliche Funktion
Definieren Sie eine Funktion, die 17 ergibt, falls ihr Argumentwert gleich 4 ist, und 12, falls ihr Argumentwert gleich 6 ist. Verwenden Sie dazu den ternären Operator.
/ Die Fakultät
Definieren Sie eine Funktion zur Berechnung der Fakultät einer natürlichen Zahl »n«, die der folgenden mathematischen Definition möglichst nahekommt.
- Mathematische Definition der Fakultät
.-
| 1, falls x = 0 und
f( n ) = <
| n * f( n - 1 ) sonst
'-
/ Textdarstellung von Schulnoten
Schreiben Sie mit Hilfe des ternären Operators eine Wertfunktion, welche dem Argumentwert »1« die Zeichenfolge »"sehr gut"« und dem Argumentwert »2« die Zeichenfolge »gut« zuordnet.
/ Textdarstellung von Schulnoten (1)
Schreiben Sie mit Hilfe des ternären Operators eine Wertfunktion, welche dem Argumentwert »1« die Zeichenfolge »"sehr gut"«, dem Argumentwert »2« die Zeichenfolge »gut« und dem Argumentwert »3« die Zeichenfolge »befriedigend« zuordnet.
/ Teilbarkeit
Schreiben Sie die Deklaration einer Funktion »d2«, so daß der Wert des Ausdrucks »d2( j )« genau dann true ist, wenn »j« durch »2« teilbar ist.
/ Schaltjahr
Schreiben Sie die Deklaration einer Funktion »schaltjahr«, so daß der Wert des Ausdrucks »schaltjahr( j )« genau dann true ist, wenn »j« ein Schaltjahr war (Diese Funktion braucht nur für Jahreszahlen von 2001 bis 2099 richtige Ergebnisse zu liefern).
Zusatzaufgaben
Diese Zusatzaufgaben sollten möglichst ohne Vorgriffe, also mit dem bisher behandelten Sprachelementen gelöst werden. (Da der Autor selber noch nicht alle Aufgaben bearbeitet hat, ist es nicht sicher, daß sich alle auf diese Weise lösen lassen. Es wird aber erwartet, daß dies möglich ist.)
/ Eine willkürliche Funktion (2)
Schreiben Sie eine Funktion, die 17 ergibt, falls ihr Argumentwert 4 ist, und 12, falls ihr Argumentwert 6 ist.
/ Normalisierung
Definieren Sie eine Funktion, welche die Zahl »0« auf »0« und alle anderen Zahlen auf »1« abbildet. Hierfür kann angenommen werden, daß als Argumentwerte nur Zahlen vorkommen.
/ Verneinung
Definieren Sie eine Funktion, die Werte, die als falsch gelten, auf »true« und alle anderen Werte auf »false« abbildet.
/ Und-Verknüpfung
Definieren Sie eine Funktion, die »true« ergibt, wenn beide Argumente als wahr gelten, und »false« sonst.
/ Oder-Verknüpfung
Definieren Sie eine Funktion, die »false« ergibt, wenn beide Argumente als falsch gelten sind, und »true« sonst.
/ exklusive oder-Verknüpfung
Definieren Sie eine Funktion, die »true« ergibt, wenn beide Argumente einander ungleich sind, und Null sonst. Hierfür kann angenommen werden, daß als Argumentwerte nur »false« und »true« vorkommen.
/ Gleichheit
Definieren Sie eine Funktion, die »true« ergibt, wenn beide Argumente einander gleich sind, und Null sonst. Hierfür kann angenommen werden, daß als Argumentwerte nur »false« und »true« vorkommen.
/ Negativ
Definieren Sie eine Funktion, die »false« ergibt, wenn ihr Argument negativ ist. Hierfür kann angenommen werden, daß als Argumentwerte nur Zahlen vorkommen.
/ Kleiner
Definieren Sie eine Funktion, die »true« ergibt, wenn das erste Argument kleiner ist als das zweite. Hierfür kann angenommen werden, daß als Argumentwerte nur Zahlen vorkommen.