JavaScript/Operatoren/Nullish Coalescing Operator
Der nullish coalescing Operator (??
) ist ein binärer Operator, der den Wert des linken Operanden zurückgibt, wenn dieser weder null
noch undefined
ist. Sonst wird der Wert des rechten Operanden zurückgegeben.
let a = null ?? 'default value'
let b = false ?? 'default value'
console.log(a) // default value
console.log(b) // false
Beschreibung
Der nullish coalescing Operator funktioniert ähnlich wie der Operator für das logische ODER (||
). Der wesentliche Unterschied besteht darin, dass der Wert des rechten Operanden nicht dann zurückgegeben wird, wenn der linke Operand falsy ist, sondern nur dann, wenn er nullish ist, das heißt, entweder null
oder undefined
.
let x, n = 0
console.log((x ?? 5) + (n ?? 3)) // 5
In dem Beispiel oben wird die Variable x
deklariert, aber nicht initialisiert, mit der Folge, dass x
implizit der Wert undefined
zugewiesen wird. Der Variable n
wird hingegen explizit der Wert 0 zugewiesen, der falsy ist, also bei Anwendung eines logischen Operators in den Wert false
konvertiert werden würde.
- Da der Wert
undefined
nullish ist, wird der Ausdruckx ?? 5
zu 5 aufgelöst. - Die Auswertung des Ausdrucks
n ?? 3
ergibt hingegen 0, da der Wert vonn
zwar falsy, aber nicht nullish ist.
Short-circuit Auswertung
Analog zu den Operatoren für das logische ODER (||
) und das logische UND (&&
), wird beim nullish coalescing Operator der Teilausdruck für den rechten Operanden nur dann ausgewertet, wenn der Wert des linken Operanden nullish ist.
let n = 0
n ?? (n = 5)
console.log(n) // 0
Da der Wert der Variable n
im obigen Beispiel werder null
noch undefined
ist, wird der Zuweisungsausdruck auf der rechten Seite nicht ausgewertet.
Zuweisung
Für den Ausdruck aus dem letzten Beispiel gibt es eine Kurzschreibweise. Wenn ein Wert nur dann zugewiesen werden soll, wenn die Variable nicht definiert oder nur mit dem Platzhalter null
versehen ist, dann kann der nullish coalescing assignment Operator (??=
) verwendet werden.
const point = {
x: null,
y: 0
}
point.x ??= 1
point.y ??= 1
console.log(point) // {x: 1, y: 0}
Dies vereinfacht Ausdrücke der Form A = A || B
, mit der zusätzlichen Absicherung, dass valide Werte, die in einem booleschen Kontext zu false
auswerten, nicht überschrieben werden.