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 ==:
- Čí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"); - Boolean a ne-Boolean: Boolean sa konvertuje na číslo (
truena 1,falsena 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"); - Null a Undefined:
nullsa porovnáva sundefinedakotrue, a s ničím iným (okrem seba) akotrue.// Výsledok: true console.log(null == undefined); // Výsledok: false console.log(null == 0); // Výsledok: false console.log(undefined == 0); - Objekt a primitiv: Objekt sa konvertuje na primitiv (pomocou metód
valueOfalebotoString), 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); - 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.