Sobes.tech
Junior

Čo sa deje v JavaScript pri neostrém porovnaní (==)?

sobes.tech AI

Odpoveď od AI

Pri neprísnom porovnaní (==) v JavaScripte sa vykonáva konverzia typov (coercion) operandov pred porovnaním. Ak sa typy operandov líšia, JavaScript sa pokúsi konvertovať jeden alebo oba operandy na jeden typ na základe niekoľkých pravidiel.

Hlavné pravidlá konverzie pri ==:

  1. Číslo a reťazec: Reťazec sa konvertuje na číslo. Ak sa nepodarí konvertovať (NaN), výsledok je vždy false.
    // "10" sa konvertuje na 10. Výsledok: true
    console.log(10 == "10");
    // "abc" sa konvertuje na NaN. Výsledok: false
    console.log(10 == "abc");
    
  2. Boolean a ne-Boolean: Boolean sa konvertuje na číslo (true na 1, false na 0). Potom sa porovnávajú číslo a iný operand (ktorý môže byť konvertovaný).
    // true sa konvertuje na 1. Výsledok: true
    console.log(true == 1);
    // false sa konvertuje na 0. Výsledok: true
    console.log(false == 0);
    // false sa konvertuje na 0, "0" sa konvertuje na 0. Výsledok: true
    console.log(false == "0");
    
  3. Null a Undefined: null sa porovnáva s undefined ako true, a s ničím iným (okrem seba) ako true.
    // Výsledok: true
    console.log(null == undefined);
    // Výsledok: false
    console.log(null == 0);
    // Výsledok: false
    console.log(undefined == 0);
    
  4. Objekt a primitiv: Objekt sa konvertuje na primitiv (pomocou metód valueOf alebo toString), potom sa porovnávajú primitivy.
    // Objekt sa konvertuje na reťazec "10" (cez toString()), potom sa porovnáva s číslom 10
    // "10" sa konvertuje na 10. Výsledok: true
    console.log({ toString: () => "10" } == 10);
    
  5. Symbol a iné: Symbol možno porovnať iba s iným symbolom alebo primitivom, na ktorý je symbol možné konvertovať (čo je v podstate nemožné v štandardných prípadoch).
    // Výsledok: false
    console.log(Symbol('a') == 'a');
    

Neprísne porovnanie môže viesť k neočakávaným výsledkom kvôli automatickej konverzii typov. Pre predvídateľnejšie správanie sa odporúča používať prísne porovnanie (===), ktoré nekonvertuje typy a porovnáva operandov priamo.