Naučte se

Operátory přiřazení a porovnání

Na základní škole, při hodinách matematiky jsme se operace přiřazování a porovnání naučili do velmé míry používat. Problémem je, že jsme pro obě operace používali jediný symbol =. S počítačem musíme komunikovat vždy jednoznačně. Tedy musíme rozlišit, kdy myslíme přiřazení a kdy naše rovnítko slouží k porovnání.

Přiřazení hodnoty

Přiřazovací operátor je nejčastěji používaným operátorem ve většině programovacích jazyků. Příkaz nastavuje hodnotu proměnné nalevo od = na hodnotu výrazu, který je vpravo. Ukázka:

// operand operátor operand
var x;
x = 42;

Můžeme přiřazovat také více hodnot naráz. U přiřazení platí pravidlo right to left, neboli z prava do leva. Znamená to, že hodnota pravé strany je přiřazovana levé straně. Příklad:

var x, y, z;
x = y = z = 42

Porovnání hodnot

Operátor porovnání porovnává své operandy a vrací logickou hodnotu podle toho, zda jsou ve shodě či ne. V javascriptu máme hned dva takovéto operátory a každý má jiný pohled na to co je shodné. Hlavní rozdíl mezi nimi je, jak pracují s datovými typy proměnných1 a přetypováním. Striktní operátor porovnání neprovádí přetypování (coercion), oproti tomu dvojité rovná se provede v případě potřeby přetypování automaticky.

Dvojité (loosy) rovná se

Podle specifikace (7.2.14 Abstract Equality Comparison2), se neprve zkontroluje zda oba operandy mají stejný datový typ. Pokud mají, pak dojde ke stejnému srovnání hodnot jako v případě striktního porovnání. Programátoři často opomíjejí, že přetypování se dotýká i srovnávacího operátoru.

Přetypování se netýká typů reprezentující prázdnou hodnotu: undefined a null. Obě jsou v případě tohoto operátoru považovány za shodné.

Když je alespoň jeden z operandů objekt, zavolá se jeho abstraktní metoda toPrimitive() a pokusí se jej převést na primitivní datový typ. Primitivní datové typy se přetupují na stejné a následně se porovnájí hodnoty.

Striktní (trojité) rovná se

Pokud chceme porovnávat dva operandy různého datového typu neuspějeme a dostaneme ihned false. Můžeme tedy porovnat pouze stejné datové typy.

U objektů se porovnává identita. Objekty se nebudou rovnát i když budou mít stejnou strukturu a hodnoty. Jejich reference musí odkazovat na stejné místo v paměti.

U proměnných stejných primitivních datových typů dojde k porovnání hodnot. Tady však pozor, existují hned dvě vyjímky v případě typu number. Pokud máme

  • obě hodnoty NaN. Ačkoliv hodnoty jsou stejné, dostaneme false.
  • porovnáváme dvě hodnoty -0 a +0. Javascript má kladnou a zápornou nulu, ale snaží se vytvářet dojem, že nula je jedna.

Operátor nerovná se

Operátory porovnání vrací logickou hodnotu, je praktické mít v jazyku i logickou negaci těchto operátorů. Dvojité rovná se má svůj protějšek v operátoru != a striktní rovná se v !==.

Jaké porovnání vybrat

Ačkoliv JS je dynamický typovaný, neznamená to, že bysme měli ignorovat typy s tím, že si vystačíme s dvojitým rovná se a javascript se o zbytek postará. Kód se striktním porovnáním je více předvídatelný a může dojít k méně okrajovým případům, kterých je u dvojitého rovná se spousta. Striktní srovnání by mělo být rychlejší.

Při programování bývá praktištější používat jednu hodnotu reprezentující prázdnou hodnotu než dvě, kterými jsou null a undefined. V tomto případě je přehlednější použít dvojité rovná se. Všechny 3 řádky jsou zaměnitelné.

if (x === null || x === undefined) {}
if (x == null) {}
if (x == undefined) {}

Při výběru operátoru bysme si měli položit dvě otázky. Víme přesně jaké datové typy budeme srovnávat? A pomůže si na tomto místě s přetypováním?

Porovnávání proměných

Související