This article has been localized into Czech by the community.
Parametry funkce
V našem úvodu do funkcí JavaScriptu jsme se již krátce podívali na parametry funkcí. Uvedl jsem argument, že parametry jsou zásadní součástí psaní dobrých funkcí, protože vám umožní předávat hodnoty funkci a nechat funkci působit na tyto hodnoty. A protože jsou parametry tak důležité pro funkce, rád bych se více ponořil do všech způsobů, jak je můžete využít ve svůj prospěch a jak fungují za scénou.
Více parametrů
Na začátek chci zdůraznit, že i když naše předchozí příklady ukázaly pouze jeden parametr, funkce v JavaScriptu mohou samozřejmě stejně snadno zpracovávat více parametrů. Zde je příklad:
function AddNumbers(n1, n2, n3)
{
return n1 + n2 + n3;
}
alert(AddNumbers(2, 3, 5));
Mnoho programovacích jazyků vyžaduje, že pokud funkce má definovaných X parametrů a žádný z nich není volitelný, musíte při volání funkce předat stejný počet hodnot. JavaScript však není tak striktní. Ve skutečnosti vám umožní předat funkci libovolný počet hodnot, bez ohledu na to, kolik parametrů definuje.
Toto chování může někdy vést k neočekávanému chování, protože co se stane, když parametr, který funkce očekává, není přítomen? Pojďme to vyzkoušet:
function AddNumbers(n1, n2, n3)
{
return n1 + n2 + n3;
}
alert(AddNumbers(2, 3));
Jak vidíte, funkce je přesně stejná jako předtím, ale tentokrát předávám, když ji volám, pouze dva čísla. Výsledek bude "NaN" (Not a Number - Nečíselná hodnota), protože třetí parametr je nyní nedefinovaný a JavaScript není schopen s tím při sčítání pracovat.
Základní validace parametrů
Takže když píšete své funkce, možná budete chtít zajistit, že provedete nějakou validaci parametrů před jejich použitím, pokud nevíte jistě, že tuto funkci bude volat pouze vy a že vždy dodáte očekávané parametry. Zde je verze, kde provádíme velmi základní validaci, abychom se ujistili, že máme parametry, které potřebujeme:
function AddNumbers(n1, n2, n3)
{
if(n3 === undefined)
n3 = 0;
return n1 + n2 + n3;
}
alert(AddNumbers(2, 3));
Vzhledem k tomu, že funkce se nazývá AddNumbers, předpokládám, že jsou vždy předány alespoň dva parametry, takže validuji pouze třetí parametr. Jednoduše zkontroluji, zda je n3 "undefined" - pokud ano, nastavím jej na 0 před provedením sčítání, aby to nijak neovlivnilo výpočet.
Proměnná arguments
Samozřejmě se v předchozím příkladu může pokazit mnoho dalších věcí - například volající funkce může předávat nečíselné textové řetězce nebo něco podobného. Kolik validace chcete provést, je na vás, ale pokud chcete provést ještě více validace, může vám pomoci proměnná arguments.
Když jste uvnitř funkce, JavaScript vám umožňuje přistupovat k magické proměnné nazvané arguments (pamatujte, parametry se někdy také nazývají argumenty), která je v podstatě strukturou podobnou poli parametrů předaných funkci. Všimněte si zde rozlišení - neříká vám nic o očekávaných/definovaných parametrech, pouze o skutečných hodnotách poskytnutých volajícím. Podívejme se na příklad, jak to funguje, abychom pro naši funkci vytvořili trochu více validace:
function AddNumbers(n1, n2, n3)
{
if(arguments.length < 3)
{
alert("Please provide exactly 3 numerical values!");
return NaN;
}
for(let i = 0; i < arguments.length; i++)
{
if(isNaN(arguments[i]))
{
alert("Please provide exactly 3 numerical values!");
return NaN;
}
}
return n1 + n2 + n3;
}
let result = AddNumbers(2, 3, 4);
if(!isNaN(result))
alert(result);
Takže to určitě udělalo naši velmi jednoduchou funkci mnohem složitější, ale jak si uvědomíte, jakmile se více ponoříte do programování, validace jakéhokoli typu často bude mít tento efekt na váš kód.
V naší funkci nyní používáme proměnnou arguments k ověření dvou věcí: Nejprve zkontrolujeme vlastnost length, abychom se ujistili, že byly předány alespoň 3 hodnoty. Poté projdeme argumenty v cyklu (protože je to pole, tak to můžeme udělat) a každý argument zkontrolujeme funkcí isNaN (zkratka pro is-not-a-number - není-číslo) - všechny parametry musí být čísla. Pokud něco z toho selže, zobrazíme upozornění a vrátíme NaN, což naznačuje, že funkce selhala.
Existuje mnoho způsobů, jak se vypořádat s validací parametrů, a zobrazování upozornění na jejím základě pravděpodobně nepatří mezi nejpopulárnější přístupy, ale pamatujte, že tento příklad má ilustrovat určitý bod. Elegantnější přístup by pravděpodobně zahrnoval výjimky, ale na to se dostaneme později.
Rest parametry
Někdy chcete, aby vaše funkce přijímaly libovolný počet parametrů. Naše funkce AddNumbers() je toho ve skutečnosti dobrým příkladem, protože proč povolit pouze sčítání 2 nebo 3 čísel? Není důvod mít zde jakékoli limity. Samozřejmě, mohli bychom použít proměnnou arguments, abychom jednoduše šli dovnitř a získali všechny hodnoty specifikované uživatelem uvnitř funkce, podobně jako jsme to udělali v příkladu s validací výše, ale pro volajícího funkce by nebylo zřejmé, že je to možné.
Pro tyto situace nabízí JavaScript "rest parametry". Jedná se o speciální typ parametru, který je označen třemi tečkami, což naznačuje, že tento parametr může přijímat více hodnot. Pojďme zkusit přepsat naši funkci AddNumbers() tak, aby používala rest parametr:
function AddNumbers(...numbers)
{
let result = 0;
for(let i = 0; i < numbers.length; i++)
result += numbers[i];
return result;
}
let result = AddNumbers(1, 2, 4, 8, 16, 32);
alert(result);
Všimněte si, že parametry funkce z předchozího příkladu jsou nyní jen jeden parametr, nazvaný numbers (čísla), a je označen třemi tečkami, což naznačuje, že jde o rest parametr. Uvnitř funkce se k parametru numbers chováme jako k poli a projdeme ho smyčkou, abychom sečetli všechna čísla.
Můžete použít běžné parametry pro vaši funkci společně s rest parametrem, ale pamatujte na následující pravidla: V jedné funkci může být pouze jeden rest parametr a musí být posledním parametrem v seznamu, takto:
function DoStuff(stuff1, stuff2, ...stuffings)
{
}
Syntaxe rozprostření (spread syntax)
Rest parametry jsou v JavaScriptu poměrně nové, byly zavedeny ve specifikaci ES6. Proto se někdy setkáte se situacemi, kdy máte pole hodnot, které byste chtěli předat JavaScriptové funkci, která přijímá neurčitý počet parametrů, ale dělá to staromódním způsobem (použitím proměnné arguments místo rest parametrů).
Příkladem toho je funkce Math.max(), která přijímá libovolné množství čísel a vrací to největší. Očekává, že každou hodnotu poskytnete jako běžný parametr, takto:
alert(Math.max(1, 42, 117, 1042));
Pokud ale již máte pole čísel, která byste chtěli zkontrolovat, možná protože máte mnoho čísel, nemá smysl je ručně specifikovat jako parametry. Pro to můžete použít syntaxi rozprostření, která vezme vaše pole a rozbalí ho na seznam běžných parametrů. Používá stejnou notaci, jako jsme viděli u rest parametrů - jednoduše před název proměnné přidejte tři tečky, abyste použili operaci rozprostření:
let numbers = [1, 42, 117, 1042];
alert(Math.max(...numbers));
Shrnutí
Jak vidíte, ze všech výše uvedených příkladů, parametry v JavaScriptu nabízejí poměrně velkou flexibilitu. Zde jsou klíčové poznatky z našeho dosud podrobného průzkumu parametrů:
- Funkce může definovat 0 nebo více parametrů, ale volající funkce není nucena poskytnout hodnoty pro všechny z nich.
- Proměnná arguments, která je dostupná uvnitř funkce, vám umožní přistupovat ke všem argumentům předaným funkci, v objektu podobném poli.
- Rest parametry jsou nový, čistší způsob specifikace funkce, která může přijímat nekonečné množství argumentů.