Pokud proměnnou inkrementujeme, znamená to, že její hodnotu zvýšíme o 1. Dekrementace je opak, tedy snižení hodnoty o 1. Javascript podporuje dvě varianty operátoru inkrementace a dekrementace a to v prefixové a postfixové formě:
Prefix | Postfix | |
---|---|---|
Inkrementace | ++x |
x++ |
Dekrementace | --x |
x-- |
Na první pohled jde o triviálně jednoduché operátory. Je potřeba si ale uvědomit, že obsahují vedlejší efekt, který z jejich zápisu nemusí být hned zřejmý.
Většina programátorů ví, že se přičte jednička. No a co. Už si matněji vybavují zda k tomu dochází hned, nebo až po návratu požadované hodnoty. Když se ++
používá na místě prefixu, tedy před proměnnou jako ++x
, jeho vedlejší efekt se vykoná před vrácením hodnoty z výrazu, nikoli po jako u x++
.
var x = 50;
x++ // 40
x; // 41
++x; // 42
x; // 42
Používání inkrementu a dekrementu je často zdrojem zbytečných chyb, které na první pohled nejsou vidět. Řada programátorů se jim cileně vyhýbá, protože se bez nich lze dobře obejít.
Stejně jako u jiných jazyků, musíme být při používání tohoto operátoru obezřetnější, abychom předešli zbytečným chybám. Představme si inkrementace v následujících situací^xpp:
x = "5";
y = x++;
Uhodnete správně jakou hodnotu má po vykonání kódu proměnná x a y?
Inkrementace řetězce
V ideálním případě inkrementujeme číselný datový typ number
. Nežijeme ale v ideálním světě a JavaScript si dokáže některé datové typy převést na číslo. Mnoho staticky typovaných jazyků by vám tohle nedovolila, tady se ale projevuje krása jednoduchého přístupu skryptovacího jazyka.
var x = "5";
x = x + 1 // "51"
var y = "5";
y++; // 5
y; // 6
Co radí specifikace?
Specifikace^ecma nám říká, jak se má prefixová inkrementace interpretovat. Vezme se původní hodnota operandu x
a vytvoří se nová číselná hodnota. Následně se hodnota nového zvýší o jedničku. Operátor ++x
si můžeme představit jako volání následující funkce:
function operatorpp(old_x) {
var orig_x = Number(old_x);
x = orig_x + 1;
return orig_x;
}
Myslíte si, že ++a++
je syntaxticky korektní? Pokud kod spustíte, zobrazí se chyba ReferenceError. Proč? Vzhledem k tomu, že operátor s vedlejšími efekty vyžadují odkaz na proměnnou, na které mohou své vedlejší efekty uplatnit.