Naučte se

Inkrementace a dekrementace

Pokud proměnnou inkrementujeme, znamená to, že její hodnotu zvýšíme o 1. Naopak dekrementovat známená snižit hodnotu o 1. Jazyk 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 mají vedlejší efekty na které je potřeba si dát pozor a že jejich zápisu nemusí být hned zřejmé kdy se tyto efekty projeví. 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í1:

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?

Specifikace2 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.

Související