Sobes.tech
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 ==:

  1. Čí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");
    
  2. Boolean a ne-Boolean: Boolean se převede na číslo (true na 1, false na 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");
    
  3. Null a Undefined: null je rovno undefined jako true, a s ničím jiným (kromě sebe sama) jako true.
    // Výsledek: true
    console.log(null == undefined);
    // Výsledek: false
    console.log(null == 0);
    // Výsledek: false
    console.log(undefined == 0);
    
  4. Objekt a primitiv: Objekt se převede na primitiv (pomocí metod valueOf nebo toString), 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);
    
  5. 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.