Inkrementace a dekrementace

AndreaAndrea

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.