Junior
Co se děje v JavaScriptu při neostrém srovnání (==)?
sobes.tech AI
Odpověď od AI
Při ne-striktním porovnání (==) v JavaScriptu se před porovnáním provádí konverze typů (coercion) operandů. Pokud se liší typy operandů, JavaScript se pokusí jeden nebo oba převést na stejný typ na základě řady pravidel.
Hlavní pravidla konverze při ==:
- Číslo a řetězec: Řetězec se převede na číslo. Pokud převod selže (NaN), výsledek je vždy
false.// "10" se převede na 10. Výsledek: true console.log(10 == "10"); // "abc" se převede na NaN. Výsledek: false console.log(10 == "abc"); - Boolean a ne-Boolean: Boolean se převede na číslo (
truena 1,falsena 0). Poté se porovnají číslo a druhý operand.// true se převede na 1. Výsledek: true console.log(true == 1); // false se převede na 0. Výsledek: true console.log(false == 0); // false se převede na 0, "0" se převede na 0. Výsledek: true console.log(false == "0"); - Null a Undefined:
nullje rovnoundefinedjakotrue, a s ničím jiným (kromě sebe sama) jakotrue.// Výsledek: true console.log(null == undefined); // Výsledek: false console.log(null == 0); // Výsledek: false console.log(undefined == 0); - Objekt a primitiv: Objekt se převede na primitiv (pomocí metod
valueOfnebotoString), a poté se porovnají primitivní hodnoty.// Objekt se převede na řetězec "10" (přes toString()), a poté se porovná s číslem 10 // "10" se převede na 10. Výsledek: true console.log({ toString: () => "10" } == 10); - Symbol a jiný: Symbol lze porovnat pouze s jiným symbolem nebo primitivní hodnotou, ke které může být symbol převeden (což je ve standardních případech nemožné).
// Výsledek: false console.log(Symbol('a') == 'a');
Ne-striktní porovnání může vést k neočekávaným výsledkům kvůli automatické konverzi typů. Pro předvídatelnější chování se doporučuje používat striktní porovnání (===), které nevykonává konverzi typů a porovnává operandů přímo.