Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork3
Nullish coalescing operator '??'#78
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
Uh oh!
There was an error while loading.Please reload this page.
Merged
Changes fromall commits
Commits
Show all changes
15 commits Select commitHold shift + click to select a range
735d1a1
1.2.12
otmon76641509c
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon76d2b9efd
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon76b072216
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon76ce31ef6
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon76a0d5677
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon7608e20aa
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon7685825cc
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon76264f05a
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon76d0f4ef1
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon761f92935
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon76fd0c7f1
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon769f7cf2d
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon7672a94aa
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon7619fe9f1
Update 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
otmon76File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
157 changes: 78 additions & 79 deletions1-js/02-first-steps/12-nullish-coalescing-operator/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,169 +1,168 @@ | ||
#Operátor koalescence „??“ | ||
[recent browser="new"] | ||
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 `a`je definovaný, pak `a`; | ||
-pokud `a`není definovaný, pak `b`. | ||
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: | ||
```js | ||
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: | ||
```js run | ||
letuživatel; | ||
alert(uživatel ?? "anonym"); //anonym (uživatel není definován) | ||
``` | ||
Zde je příklad, kde má proměnná `uživatel` přiřazenou hodnotu: | ||
```js run | ||
letuživatel = "Jan"; | ||
alert(uživatel ?? "anonym"); //Jan (uživatel je definován) | ||
``` | ||
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`??`: | ||
```js run | ||
letjméno = null; | ||
letpříjmení = null; | ||
letpř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](info:logical-operators#or-finds-the-first-truthy-value). | ||
Například ve výše uvedeném kódu můžeme operátor`??`nahradit operátorem`||`a získat stejný výsledek: | ||
```js run | ||
letjméno = null; | ||
letpříjmení = null; | ||
letpřezdívka = "Supercoder"; | ||
//zobrazí první pravdivou hodnotu: | ||
*!* | ||
alert(jméno ||příjmení ||přezdívka || "anonym"); // Supercoder | ||
*/!* | ||
``` | ||
Historicky tu operátorOR `||`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: | ||
```js run | ||
letvýška = 0; | ||
alert(výška || 100); // 100 | ||
alert(výška ?? 100); // 0 | ||
``` | ||
-`výška || 100`prověří, zda `výška` je nepravdivá hodnota, a protože je`0`,je tomu tak. | ||
- výsledkem`||`je tedy druhý argument `100`. | ||
-`výška ?? 100`prověří, zda `výška` je`null/undefined`,a to není. | ||
- výsledkem je tedy `výška` tak, jak je, tedy `0`. | ||
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](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table) prioritu `4`. | ||
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: | ||
```js run | ||
letvýška = null; | ||
letšířka = null; | ||
//důležité: použijte závorky | ||
letplocha = (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. | ||
```js | ||
//bez závorek | ||
letplocha =výška ?? 100 *šířka ?? 50; | ||
// ...funguje stejně jako toto (což jsme nechtěli): | ||
letplocha =výška ?? (100 *šířka) ?? 50; | ||
``` | ||
###Používání ??společně s&&nebo || | ||
Z bezpečnostních důvodůJavaScriptzakazuje 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: | ||
```js run | ||
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: | ||
```js run | ||
*!* | ||
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: | ||
```js | ||
//nastavíme proměnnou výška=100,je-li proměnná výška nullnebo 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. |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.