TOC

This article has been localized into Czech by the community.

Operátory:

Operátor spojování s nulou (??)

Ve vývojovém prostředí programovacích jazyků, jako je JavaScript a mnoho dalších, se vynakládá velké úsilí na to, aby bylo zajištěno, že proměnná nebo návratová hodnota skutečně MÁ hodnotu a není ve skutečnosti NULL (nebo v JavaScriptu undefined). Toto úsilí je klíčové pro zajištění spolehlivosti a předvídatelnosti chování kódu, protože práce s neinicializovanými nebo neexistujícími hodnotami může vést k neočekávaným chybám nebo výsledkům. Proto vývojáři a jazyky přijímají různé strategie a nástroje, jako jsou typové systémy, kontrola nulových hodnot a operátory jako je operátor spojování s nulou (??), aby tyto problémy minimalizovali.

Ano, před použitím proměnné je často nutné zajistit, že má hodnotu, pokud už nevíte, že to pravda je. Místo, kde je to velmi běžné, je uvnitř funkce, kde chcete mít jistotu, že všechny parametry, které hodláte použít, skutečně mají hodnotu. Zde je příklad z jiného článku tohoto tutoriálu:

function AddNumbers(n1, n2, n3)
{
	return n1 + n2 + n3;
}

Vzhledem k tomu, že JavaScript ve skutečnosti neprovádí žádnou validaci, pokud jde o množství nebo typ argumentů, které předáte funkci, výše uvedená funkce by mohla být volána takto:

AddNumbers(null);

Výsledek by nedával smysl, protože první parametr je NULL a dva další by byly undefined - s tím se opravdu nedá počítat. Proto bychom obvykle prováděli nějakou validaci parametrů, jako například:

function AddNumbers(n1, n2, n3)
{
	if(n1 == null)
		n1 = 0;
	if(n2 == null)
		n2 = 0;
	if(n3 == null)
		n3 = 0;
	return n1 + n2 + n3;
}

Použití operátoru ??

To nevypadá příliš dobře, ale naštěstí pro nás JavaScript obsahuje velmi užitečný operátor: Operátor spojování s nulou (??). Funguje to takto:

testExpression ?? "fallback value";

Jednoduše vrátí buď levou nebo pravou část výrazu, v závislosti na tom, zda je levá část NULL nebo undefined, nebo ne. Jedná se většinou jen o syntaktické zjednodušení, ale zkrátí a zpřehlední výše uvedený kód:

function AddNumbers(n1, n2, n3)
{
	n1 = n1 ?? 0;
	n2 = n2 ?? 0;
	n3 = n3 ?? 0;	
	return n1 + n2 + n3;
}

alert(AddNumbers(null));
alert(AddNumbers(1, 2, 3));

V tomto případě, pokud jeden nebo více parametrů nemá hodnotu, bude jako záložní hodnota použita 0. Můžete poskytnout jakýkoli typ záložní hodnoty, jako je řetězec nebo návratová hodnota jiné funkce - možností je zde opravdu mnoho.

?? vs. ||

Před zavedením operátoru spojování s nulou (??) byl často používán logický operátor OR (||) k dosažení stejného efektu jako operátor ??. A stále se můžete setkat s kódem, který vypadá takto:

function AddNumbers(n1, n2, n3)
{
	n1 = n1 || 0;
	...

Jak můžete vidět, operátor ?? jsem nahradil operátorem ||. Pokud to uděláte stejně pro výše uvedený příklad, uvidíte přesně stejné a očekávané chování: Parametry se vrátí k hodnotě 0, pokud nejsou poskytnuty. Avšak mezi oběma operátory existuje velmi důležitý rozdíl: Operátor ?? bude reagovat pouze na NULL nebo undefined, zatímco operátor || bude reagovat negativně na jakoukoli "falsy" hodnotu.

Jak jsme již dříve v tomto tutoriálu zmínili, termín "falsy" se používá pro popis jakékoli hodnoty, která je ve skutečnosti nepravdivá nebo by mohla být v booleovském kontextu považována za nepravdivou. To zahrnuje číslo 0, prázdné textové řetězce a tak dále. Proto byste měli věnovat pozornost tomu, který operátor používáte, protože to bude mít významný rozdíl, jak je ilustrováno tímto příkladem:

function SaySomething(msg1, msg2)
{
	msg1 = msg1 || "fallback";
	msg2 = msg2 ?? "fallback"
	alert("Message #1: " + msg1);
	alert("Message #2: " + msg2);
	
}

SaySomething();
SaySomething("", "");
SaySomething(0, 0);

Pokud použiji operátor || pro první zprávu a ?? pro druhou zprávu, všimněte si, jak různě reagují na různé argumenty, které jim poskytnu. Záložní zpráva pro msg2 je použita pouze při prvním volání funkce, protože reaguje pouze na hodnotu undefined.

Operátor přiřazení spojování s nulou ??=

Operátor přiřazení spojování s nulou (někdy označovaný jako logický operátor přiřazení spojování s nulou) umožňuje přiřadit hodnotu proměnné, ale pouze pokud je hodnota této proměnné NULL nebo undefined, a to bez nutnosti ji předtím kontrolovat. Před zavedením tohoto operátoru byste mohli vidět kód jako tento:

let a = null;
if(a == null)
	a = 42;
alert(a);

Nebo byste mohli použít operátor spojování s nulou, aby byl kód trochu kratší:

let a = null;
a = a ?? 42;
alert(a);

Ale proč nejít až do konce a udělat kód ještě kratší, použitím operátoru přiřazení spojování s nulou, takto:

let a = null;
a ??= 42;
alert(a);

Opět se jedná jen o syntaktické zjednodušení, ale může být trochu snazší na psaní a možná i na čtení? Posuďte sami.

Na tomto místě můžete být trochu zmateni a ptát se sami sebe: Existují mezi těmito dvěma operátory nějaké rozdíly? Ano, existuje - malý, ale přesto rozdíl. Zatímco operátor spojování s nulou (??) vrátí levou část výroku, pokud není NULL nebo undefined, operátor přiřazení spojování s nulou (??=) nevrátí nic - funguje pouze pro přiřazení hodnoty levé části výroku v případě, že je NULL nebo undefined.

Shrnutí

Použijte operátor spojování s nulou (??) pro poskytnutí záložní hodnoty v případě, že dotyčná proměnná je NULL nebo undefined. Jako alternativu můžete použít logický operátor OR (||), který použije záložní hodnotu pro cokoli, co může být považováno za nepravdivé, včetně NaN, 0, prázdných textových řetězců atd.

Pokud chcete pouze přiřadit hodnotu proměnné v případě, že je proměnná NULL nebo undefined, můžete použít operátor přiřazení spojování s nulou (??=).


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!