Mnoho operátorů známe ze Å¡koly. Jsou mezi nimi sÄÃtánà +, násobenà *, odÄÃtánà - a podobnÄ.
V této kapitole zaÄneme jednoduchými operátory a pak se budeme soustÅedit na prvky specifické pro JavaScript, které Å¡kolnà aritmetika nepokrývá.
Pojmy: âunárnÃâ, âbinárnÃâ, âoperandâ
Než budeme pokraÄovat, ujasnÃme si základnà terminologii.
-
Operand je to, na co se aplikujà operátory. NapÅÃklad pÅi násobenÃ
5 * 2máme dva operandy: levý operand je5a pravý operand je2. NÄkdy se jim mÃsto âoperandyâ ÅÃká âargumentyâ. -
Operátor je unárnÃ, jestliže má jediný operand. NapÅÃklad unárnà negace
-, která obracà znaménko ÄÃsla:let x = 1; x = -x; alert( x ); // -1, byla aplikována unárnà negace -
Operátor je binárnÃ, jestliže má dva operandy. Stejné minus existuje i v binárnà podobÄ:
let x = 1, y = 3; alert( y - x ); // 2, binárnà minus odeÄÃtá hodnoty
FormálnÄ majà výše uvedené pÅÃklady dva různé operátory, které majà stejný symbol: operátor negace, což je unárnà operátor mÄnÃcà znaménko, a operátor odÄÃtánÃ, což je binárnà operátor odeÄÃtajÃcà jedno ÄÃslo od druhého.
Matematika
JavaScript podporuje následujÃcà matematické operace:
- sÄÃtánÃ
+, - odÄÃtánÃ
-, - násobenÃ
*, - dÄlenÃ
/, - zbytek po dÄlenÃ
%, - umocÅovánÃ
**.
Prvnà ÄtyÅi jsou jasné, % a ** potÅebujà trochu vysvÄtlenÃ.
Zbytek po dÄlenà %
Operátor zbytku po dÄlenà % nemá navzdory svému symbolu nic spoleÄného s procenty.
Výsledkem a % b je zbytek pÅi celoÄÃselném dÄlenà ÄÃsla a ÄÃslem b.
PÅÃklad:
alert( 5 % 2 ); // 1, zbytek po dÄlenà 5 dÄleno 2
alert( 8 % 3 ); // 2, zbytek po dÄlenà 8 dÄleno 3
alert( 8 % 4 ); // 0, zbytek po dÄlenà 8 dÄleno 4
UmocÅovánà **
Operátor umocÅovánà a ** b umocnà a na b-tou.
Ve školnà matematice to zapisujeme ab.
PÅÃklad:
alert( 2 ** 2 ); // 2² = 4
alert( 2 ** 3 ); // 2³ = 8
alert( 2 ** 4 ); // 2â´ = 16
StejnÄ jako v matematice je operátor umocÅovánà definován i pro necelá ÄÃsla.
NapÅÃklad odmocnina je umocnÄnà na ½:
alert( 4 ** (1/2) ); // 2 (umocnÄnà na 1/2 je totéž jako druhá odmocnina)
alert( 8 ** (1/3) ); // 2 (umocnÄnà na 1/3 je totéž jako tÅetà odmocnina)
Spojenà ÅetÄzců pomocà binárnÃho +
PÅejdÄme nynà k vlastnostem JavaScriptu, které jsou za hranicemi Å¡kolnà aritmetiky.
Operátor plus + obvykle sÄÃtá ÄÃsla.
Pokud je vÅ¡ak binárnà + použito na ÅetÄzce, spojà je (zÅetÄzÃ):
let s = "můj" + "ÅetÄzec";
alert(s); // můjÅetÄzec
VÅ¡imnÄte si, že jestliže je kterýkoli z operandů ÅetÄzec, bude na ÅetÄzec pÅeveden i druhý operand.
PÅÃklad:
alert( '1' + 2 ); // "12"
alert( 2 + '1' ); // "21"
VidÃme, že nezáležà na tom, zda je ÅetÄzec prvnà nebo druhý operand.
SložitÄjšà pÅÃklad:
alert(2 + 2 + '1' ); // "41", ne "221"
Tady operátory fungujà jeden za druhým. Prvnà + seÄte dvÄ ÄÃsla, takže vrátà 4, pak druhé + k nÄmu pÅidá ÅetÄzec 1, takže je to jako 4 + '1' = 41.
alert('1' + 2 + 2); // "122" a ne "14"
Prvnà operand je zde ÅetÄzec, takže kompilátor zacházà i s ostatnÃmi dvÄma operandy jako s ÅetÄzci. 2 se zÅetÄzà s '1', takže to bude jako '1' + 2 = "12" a "12" + 2 = "122".
Binárnà + je jediný operátor, který takovýmto způsobem podporuje ÅetÄzce. Ostatnà aritmetické operátory fungujà jen s ÄÃsly a své operandy pÅevádÄjà vždy na ÄÃsla.
Ukázka odÄÃtánà a dÄlenÃ:
alert( 6 - '2' ); // 4, pÅevede '2' na ÄÃslo
alert( '6' / '2' ); // 3, pÅevede oba operandy na ÄÃsla
Konverze na ÄÃslo a unárnà +
Plus + existuje ve dvou podobách: binárnÃ, kterou jsme použÃvali výše, a unárnÃ.
Unárnà plus, jinými slovy operátor + aplikovaný na jedinou hodnotu, neprovádà s ÄÃsly nic. Jestliže vÅ¡ak operand nenà ÄÃslo, unárnà plus jej pÅevede na ÄÃslo.
PÅÃklad:
// Žádný efekt na ÄÃsla
let x = 1;
alert( +x ); // 1
let y = -2;
alert( +y ); // -2
// PÅevádà hodnoty, které nejsou ÄÃsla
alert( +true ); // 1
alert( +"" ); // 0
DÄlá tedy ve skuteÄnosti totéž jako Number(...), ale je kratÅ¡Ã.
PotÅeba pÅevádÄt ÅetÄzce na ÄÃsla se objevuje velmi Äasto. NapÅÃklad jestliže naÄÃtáme hodnoty z polà HTML formuláÅů, jsou to obvykle ÅetÄzce. Co když je chceme seÄÃst?
Binárnà plus by je spojilo jako ÅetÄzce:
let jablka = "2";
let pomeranÄe = "3";
alert( jablka + pomeranÄe ); // "23", binárnà plus spojuje ÅetÄzce
Pokud s nimi chceme zacházet jako s ÄÃsly, musÃme je napÅed konvertovat a teprve pak seÄÃst:
let jablka = "2";
let pomeranÄe = "3";
// obÄ hodnoty pÅevedeme na ÄÃsla pÅed binárnÃm plus
alert( +jablka + +pomeranÄe ); // 5
// delšà varianta
// alert( Number(jablka) + Number(pomeranÄe) ); // 5
Z pohledu matematika může pÅemÃra plusů vypadat podivnÄ, ale z pohledu programátora na tom nic zvláštnÃho nenÃ: nejprve se aplikujà unárnà plusy, které pÅevedou ÅetÄzce na ÄÃsla, a pak je binárnà plus seÄte.
ProÄ se unárnà plusy aplikujà na hodnoty dÅÃve než binárnÃ? Jak uvidÃme, je to důsledkem jejich vyššà priority.
Priorita operátorů
Obsahuje-li výraz vÃce než jeden operátor, je poÅadà jejich výkonu definováno jejich prioritou, nebo jinými slovy standardnÃm poÅadÃm operátorů.
Ze Å¡koly jistÄ vÅ¡ichni vÃme, že ve výrazu 1 + 2 * 2 by násobenà mÄlo být vyhodnoceno pÅed sÄÃtánÃm. To je pÅesnÄ otázkou priority. ÅÃkáme, že násobenà má vyššà prioritu než sÄÃtánÃ.
Závorky majà pÅednost pÅed veÅ¡kerou prioritou, takže nejsme-li spokojeni se standardnÃm poÅadÃm, můžeme je s jejich pomocà zmÄnit. NapÅÃklad zapÃÅ¡eme (1 + 2) * 2.
JavaScript obsahuje mnoho operátorů. Každému z nich odpovÃdá hodnota jeho priority. DÅÃve se vykoná ten, jehož priorita je vyššÃ. Je-li priorita vÃce operátorů stejná, vykonávajà se v poÅadà zleva doprava.
Následuje výtažek z tabulky priorit (nemusÃte si ji celou pamatovat, ale vÅ¡imnÄte si, že unárnà operátory majà vyššà prioritu než odpovÃdajÃcà binárnÃ):
| Priorita | Název | Znak |
|---|---|---|
| ⦠| ⦠| ⦠|
| 14 | unárnà plus | + |
| 14 | unárnà negace | - |
| 13 | umocÅovánà | ** |
| 12 | násobenà | * |
| 12 | dÄlenà | / |
| 11 | sÄÃtánà | + |
| 11 | odÄÃtánà | - |
| ⦠| ⦠| ⦠|
| 2 | pÅiÅazenà | = |
| ⦠| ⦠| ⦠|
Jak vidÃme, âunárnà plusâ má prioritu 14, která je vyššà než priorita 11 âsÄÃtánÃâ (binárnà plus). To je důvod, proÄ se ve výrazu "+jablka + +pomeranÄe" unárnà plusy vyhodnotà pÅed sÄÃtánÃm.
PÅiÅazenÃ
VÅ¡imnÄte si, že pÅiÅazenà = je také operátor. V tabulce priorit je uveden s velmi nÃzkou prioritou 2.
To je důvod, proÄ pÅi pÅiÅazenà promÄnné, napÅ. x = 2 * 2 + 1, se nejprve provedou výpoÄty a až potom se vyhodnotà =, které uložà výsledek do x.
let x = 2 * 2 + 1;
alert( x ); // 5
PÅiÅazenà = vrátà hodnotu
SkuteÄnost, že = je operátor a ne nÄjaký âmagickýâ jazykový konstrukt, má zajÃmavý důsledek.
VÅ¡echny operátory v JavaScriptu vracejà nÄjakou hodnotu. Pro + a - je to samozÅejmé, ale platà to i pro =.
Volánà x = hodnota zapÃÅ¡e hodnotu hodnota do x a pak ji vrátÃ.
Následuje ukázka, v nÞ je pÅiÅazenà využito jako souÄást složitÄjÅ¡Ãho výrazu:
let a = 1;
let b = 2;
let c = 3 - (a = b + 1);
alert( a ); // 3
alert( c ); // 0
V uvedeném pÅÃkladu je výsledkem výrazu (a = b + 1) hodnota, která je pÅiÅazena do a (což je 3). Ta se pak použije pro dalšà výpoÄty.
LegraÄnà kód, že? MÄli bychom porozumÄt, jak funguje, protože v knihovnách JavaScriptu bývá obÄas k vidÄnÃ.
PÅesto vás prosÃme, abyste takový kód nepsali. Takové triky zcela jistÄ nepÅispÃvajà k jeho jasnosti a Äitelnosti.
ZÅetÄzenà pÅiÅazenÃ
Dalšà zajÃmavá vlastnost je možnost zÅetÄzit pÅiÅazenà za sebou:
let a, b, c;
a = b = c = 2 + 2;
alert( a ); // 4
alert( b ); // 4
alert( c ); // 4
ZÅetÄzená pÅiÅazenà se vyhodnocujà zprava doleva. Nejprve se vyhodnotà výraz 2 + 2 nejvÃce vpravo a jeho hodnota se pak pÅiÅadà do promÄnných vlevo: c, b a a. Nakonec tedy budou mÃt vÅ¡echny promÄnné stejnou hodnotu.
OpÄt je pro úÄely Äitelnosti lepšà rozdÄlit takový kód do vÃce Åádků:
c = 2 + 2;
b = c;
a = c;
SnadnÄji se to Äte, zejména když kód rychle projÞdÃte oÄima.
Modifikace na mÃstÄ
Äasto potÅebujeme aplikovat operátor na nÄjakou promÄnnou a uložit nový výsledek do této promÄnné.
PÅÃklad:
let n = 2;
n = n + 5;
n = n * 2;
Tento zápis lze zkrátit pomocà operátorů += a *=:
let n = 2;
n += 5; // nynà n = 7 (totéž jako n = n + 5)
n *= 2; // nynà n = 14 (totéž jako n = n * 2)
alert( n ); // 14
Takové âmodifikaÄnÃâ operátory existujà pro vÅ¡echny aritmetické a bitové operátory: /=, -=, apod.
Tyto operátory majà stejnou prioritu jako bÄžné pÅiÅazenÃ, takže se provedou až po vÄtÅ¡inÄ ostatnÃch výpoÄtů:
let n = 2;
n *= 3 + 5; // napÅed se provede Äást vpravo, totéž jako n *= 8
alert( n ); // 16
Inkrementace a dekrementace
Jednou z nejbÄžnÄjÅ¡Ãch ÄÃselných operacà je zvýšenà nebo snÞenà ÄÃsla o 1 (inkrementace, dekrementace).
Proto pro nÄ existujà speciálnà operátory:
-
Inkrementace
++zvýšà promÄnnou o 1:let ÄÃtaÄ = 2; ÄÃtaÄ++; // funguje stejnÄ jako ÄÃtaÄ = ÄÃtaÄ + 1, ale je to kratšà alert( ÄÃtaÄ ); // 3 -
Dekrementace
--snÞà promÄnnou o 1:let ÄÃtaÄ = 2; ÄÃtaÄ--; // funguje stejnÄ jako ÄÃtaÄ = ÄÃtaÄ - 1, ale je to kratšà alert( ÄÃtaÄ ); // 1
Inkrementaci a dekrementaci lze aplikovat pouze na promÄnné. Pokus použÃt ji na hodnotu, napÅ. 5++, vyvolá chybu.
Operátory ++ a -- lze umÃstit pÅed i za promÄnnou.
- Je-li operátor umÃstÄn za promÄnnou, nazývá se to âpostfixová notaceâ:
ÄÃtaÄ++. - âPrefixová notaceâ je umÃstÄnà operátoru pÅed promÄnnou:
++ÄÃtaÄ.
Oba tyto pÅÃkazy vykonajà totéž: zvýšà ÄÃtaÄ o 1.
Je v nich tedy nÄjaký rozdÃl? Ano, ale uvidÃme ho jen tehdy, když použijeme hodnotu, kterou operátor ++/-- vrátÃ.
UjasnÄme si to. Jak vÃme, vÅ¡echny operátory vracejà nÄjakou hodnotu. Inkrementace a dekrementace nejsou výjimkou. Prefixová notace vracà novou hodnotu, zatÃmco postfixová notace vracà starou hodnotu (tu pÅed zvýšenÃm nebo snÞenÃm).
Abychom vidÄli rozdÃl, uvedeme pÅÃklad:
let ÄÃtaÄ = 1;
let a = ++ÄÃtaÄ; // (*)
alert(a); // 2
Na Åádku (*) prefixová notace ++ÄÃtaÄ zvýšila ÄÃtaÄ a vrátila novou hodnotu, 2. Proto alert zobrazila 2.
Nynà použijeme postfixovou notaci:
let ÄÃtaÄ = 1;
let a = ÄÃtaÄ++; // (*) zmÄnili jsme ++ÄÃtaÄ na ÄÃtaÄ++
alert(a); // 1
Na Åádku (*) postfixová notace ÄÃtaÄ++ rovnÄž zvýšila ÄÃtaÄ, ale vrátila starou hodnotu (tu pÅed zvýšenÃm). Proto alert zobrazil 1.
Shrneme to:
-
Pokud výsledek zvýšenà nebo snÞenà nepoužijeme, nenà rozdÃl v tom, kterou notaci použijeme:
let ÄÃtaÄ = 0; ÄÃtaÄ++; ++ÄÃtaÄ; alert( ÄÃtaÄ ); // 2, oba výše uvedené Åádky dÄlajà totéž -
Pokud chceme zvýšit hodnotu a výsledek operátoru ihned použÃt, potÅebujeme prefixovou notaci:
let ÄÃtaÄ = 0; alert( ++ÄÃtaÄ ); // 1 -
Pokud chceme zvýšit hodnotu, ale použÃt pÅedchozà hodnotu, potÅebujeme postfixovou notaci:
let ÄÃtaÄ = 0; alert( ÄÃtaÄ++ ); // 0
Operátory ++/-- je možné použÃt i uvnitÅ výrazů. Jejich priorita je vyššà než priorita vÄtÅ¡iny ostatnÃch aritmetických operacÃ.
PÅÃklad:
let ÄÃtaÄ = 1;
alert( 2 * ++ÄÃtaÄ ); // 4
Porovnejte si to s:
let ÄÃtaÄ = 1;
alert( 2 * ÄÃtaÄ++ ); // 2, protože ÄÃtaÄ++ vracà âstarouâ hodnotu
AÄkoli je to technicky v poÅádku, takový zápis obvykle snižuje Äitelnost kódu. Jeden Åádek provádà vÃce vÄcÃ, a to nenà dobré.
Když Äteme kód, pÅi rychlém âsvislémâ projÞdÄnà oÄima můžeme snadno pÅehlédnout nÄco jako ÄÃtaÄ++ a nevÅ¡imneme si, že se promÄnná zvýšila.
DoporuÄujeme psát stylem âjeden Åádek â jedna akceâ:
let ÄÃtaÄ = 1;
alert( 2 * ÄÃtaÄ );
ÄÃtaÄ++;
Bitové operátory
Bitové operátory zacházejà s argumenty jako s 32-bitovými celými ÄÃsly a pracujà na úrovni jejich binárnà reprezentace.
Tyto operátory nejsou specifické pro JavaScript. Podporuje je vÄtÅ¡ina programovacÃch jazyků.
Seznam operátorů:
- AND (
&) - OR (
|) - XOR (
^) - NOT (
~) - LEFT SHIFT (posun doleva) (
<<) - RIGHT SHIFT (posun doprava) (
>>) - ZERO-FILL RIGHT SHIFT (posun doprava s doplnÄnÃm nul) (
>>>)
Tyto operátory se použÃvajà jen velmi zÅÃdka, když potÅebujeme pracovat s ÄÃsly na naprosto nejnižšà (bitové) úrovni. Nebudeme je v dohledné dobÄ potÅebovat, jelikož pÅi vývoji webů se využÃvajà jen málokdy, ale jsou užiteÄné v nÄkterých speciálnÃch oblastech, napÅÃklad v kryptografii. Až je budete potÅebovat, můžete si o nich pÅeÄÃst Älánek na MDN.
Äárka
Operátor Äárky , je jeden z nejvzácnÄjÅ¡Ãch a nejneobvyklejÅ¡Ãch operátorů. NÄkdy se použÃvá k psanà kratÅ¡Ãho kódu, takže jej potÅebujeme znát, abychom pochopili, o co tady jde.
Operátor Äárky nám umožÅuje vyhodnotit nÄkolik výrazů za sebou, oddÄlených Äárkou ,. Vyhodnotà se každý z nich, ale vrátà se jen výsledek poslednÃho.
PÅÃklad:
let a = (1 + 2, 3 + 4);
alert( a ); // 7 (výsledek 3 + 4)
Zde se napÅed vyhodnotà prvnà výraz 1 + 2 a jeho výsledek se zahodÃ. Pak se vyhodnotà 3 + 4 a jeho výsledek je vrácen.
VÅ¡imnÄte si, že operátor Äárky má velmi nÃzkou prioritu, dokonce nižšà než =, takže závorky jsou ve výše uvedeném pÅÃkladu nezbytné.
Bez nich: a = 1 + 2, 3 + 4, jako prvnà by se vyhodnotilo +, které by seÄetlo ÄÃsla do a = 3, 7, pak by operátor pÅiÅazenà = pÅiÅadil a = 3 a zbytek by se ignoroval. Bylo by to jako (a = 1 + 2), 3 + 4.
K Äemu potÅebujeme operátor, který zahodà vÅ¡echno kromÄ poslednÃho výrazu?
NÄkdy jej lidé použÃvajà ve složitÄjÅ¡Ãch konstrukcÃch, aby umÃstili nÄkolik akcà na jeden Åádek.
PÅÃklad:
// tÅi operace na jednom Åádku
for (a = 1, b = 3, c = a * b; a < 10; a++) {
...
}
Takové triky se použÃvajà v mnoha rámcÃch JavaScriptu, a proto se o nich zmiÅujeme. Obvykle vÅ¡ak zrovna nezlepÅ¡ujà Äitelnost kódu, a proto byste si jejich použÃvánà mÄli dobÅe rozmyslet.
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â¦)