Operátor koalescence se zapisuje dvÄma otaznÃky za sebou ??.
Protože tento operátor zacházà s hodnotami null a undefined podobnÄ, budeme v tomto Älánku použÃvat speciálnà pojem. ÅeknÄme, že výraz je âdefinovánâ, pokud nemá hodnotu null ani undefined.
Výsledkem a ?? b je:
- pokud
aje definovaný, paka; - pokud
anenà definovaný, pakb.
Jinými slovy, ?? vrátà prvnà argument, jestliže nemá hodnotu null/undefined. Jinak vrátà druhý argument.
Operátor koalescence nenà zcela nová vÄc. Je to jen pÄkná syntaxe, jak vrátit prvnà âdefinovanouâ hodnotu ze dvou.
Můžeme pÅepsat result = a ?? b pomocà operátorů, které již známe, napÅÃklad:
result = (a !== null && a !== undefined) ? a : b;
Nynà by mÄlo být naprosto zÅejmé, co ?? umÃ. PodÃváme se, kde nám pomůže.
Operátor ?? se bÄžnÄ použÃvá k udánà výchozà hodnoty.
NapÅÃklad zde zobrazÃme anonym, jestliže promÄnná uživatel nenà definována:
let uživatel;
alert(uživatel ?? "Anonym"); // Anonym (uživatel má hodnotu undefined)
Zde je pÅÃklad, kde má promÄnná uživatel pÅiÅazenou hodnotu:
let uživatel = "Jan";
alert(uživatel ?? "Anonym"); // Jan (uživatel nemá hodnotu null/undefined)
Můžeme také použÃt sekvenci ?? k výbÄru prvnà hodnoty ze seznamu, která nenà null/undefined.
PÅedstavme si, že máme data o uživateli v promÄnných jméno, pÅÃjmenà a pÅezdÃvka. VÅ¡echny mohou být nedefinované, jestliže se uživatel rozhodl tyto informace nevyplnit.
Rádi bychom zobrazili uživatelské jméno: jednu z tÄchto tÅà promÄnných, nebo âanonymâ, pokud žádná z nich nenà definována.
Použijeme k tomu operátor ??:
let jméno = null;
let pÅÃjmenà = null;
let pÅezdÃvka = "Supercoder";
// zobrazÃme prvnà definovanou hodnotu:
alert(jméno ?? pÅÃjmenà ?? pÅezdÃvka ?? "anonym"); // Supercoder
Srovnánàs ||
Operátor OR || můžeme použÃvat stejným způsobem jako ??, jak bylo popsáno v pÅedchozà kapitole.
NapÅÃklad ve výše uvedeném kódu můžeme operátor ?? nahradit operátorem || a zÃskat stejný výsledek:
let jméno = null;
let pÅÃjmenà = null;
let pÅezdÃvka = "Supercoder";
// zobrazà prvnà pravdivou hodnotu:
alert(jméno || pÅÃjmenà || pÅezdÃvka || "anonym"); // Supercoder
Historicky tu operátor OR || byl dÅÃve. Existuje již od zaÄátků JavaScriptu, takže jej vývojáÅi pro tyto úÄely dlouhou dobu skuteÄnÄ použÃvali.
Naproti tomu operátor koalescence ?? byl do JavaScriptu pÅidán teprve nedávno a důvodem bylo, že lidé nebyli s operátorem || zcela spokojeni.
Důležitý rozdÃl mezi nimi je, že:
||vracà prvnà pravdivou hodnotu.??vracà prvnà definovanou hodnotu.
Jinými slovy, || nerozliÅ¡uje mezi false, 0, prázdným ÅetÄzcem "" a null/undefined. Pro nÄj jsou vÅ¡echny stejné â nepravdivé hodnoty. Je-li kterákoli z nich prvnÃm argumentem ||, dostaneme jako výsledek druhou hodnotu.
V praxi vÅ¡ak můžeme chtÃt použÃt defaultnà hodnotu jen tehdy, je-li promÄnná null/undefined, tedy když hodnota je opravdu neznámá nebo nenà nastavena.
Jako pÅÃklad posloužà tento kód:
let výška = 0;
alert(výška || 100); // 100
alert(výška ?? 100); // 0
výška || 100provÄÅÃ, zdavýškaje nepravdivá hodnota, a protože je0, je tomu tak.- výsledkem
||je tedy druhý argument100.
- výsledkem
výška ?? 100provÄÅÃ, zdavýškajenull/undefined, a to nenÃ.- výsledkem je tedy
výškatak, jak je, tedy0.
- výsledkem je tedy
V praxi je nulová výška Äasto platnou hodnotou, takže by nemÄla být nahrazena defaultnà hodnotou. Zde tedy bude správnÄ fungovat ??.
Priorita
Priorita operátoru ?? je stejná jako ||. Oba operátory majà v tabulce MDN prioritu 3.
To znamená, že operátor koalescence ?? se stejnÄ jako || vyhodnocuje pÅed = a ?, ale až po vÄtÅ¡inÄ ostatnÃch operacÃ, napÅÃklad +, *.
Jestliže tedy chcete vybrat hodnotu pomocà ?? ve výrazu obsahujÃcÃm i jiné operátory, zvažte použità závorek:
let výška = null;
let Å¡ÃÅka = null;
// důležité: použijte závorky
let plocha = (výška ?? 100) * (Å¡ÃÅka ?? 50);
alert(plocha); // 5000
Kdybychom závorky nepoužili, * by se vykonalo dÅÃv, neboÅ¥ má vyššà prioritu než ??. To by vedlo k nesprávným výsledkům.
// bez závorek
let plocha = výška ?? 100 * Å¡ÃÅka ?? 50;
// ...funguje stejnÄ jako toto (což jsme nechtÄli):
let plocha = výška ?? (100 * Å¡ÃÅka) ?? 50;
PoužÃvánà ?? spoleÄnÄ s && nebo ||
Z bezpeÄnostnÃch důvodů JavaScript zakazuje použÃvat ?? spoleÄnÄ s operátory && a ||, pokud nenà priorita výslovnÄ uvedena pomocà závorek.
NásledujÃcà kód vydá syntaktickou chybu:
let x = 1 && 2 ?? 3; // Syntaktická chyba
Toto omezenà je bezpochyby diskutabilnÃ. Do specifikace jazyka bylo pÅidáno za úÄelem zabránit programátorským chybám, kdy lidé zaÄnou z || pÅecházet na ??.
Omezenà se dá se obejÃt pomocà závorek:
let x = (1 && 2) ?? 3; // funguje
alert(x); // 2
ShrnutÃ
-
Operátor koalescence
??poskytuje zkratku, jak vybrat prvnà âdefinovanouâ hodnotu ze seznamu.PoužÃvá se k pÅiÅazenà výchozÃch hodnot do promÄnných:
// nastavÃme promÄnnou výška=100, je-li promÄnná výška null nebo undefined výška = výška ?? 100; -
Operátor
??má velmi nÃzkou prioritu, jen o nÄco vyššà než?a=, takže když jej použÃváte ve výrazu, zvažte použità závorek. -
Je zakázáno použÃvat jej spolu s operátory
||nebo&&bez uvedenà závorek.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)