Sobes.tech
Junior

Mis juhtub JavaScriptis mitte-täpselise võrdlusega (==)?

sobes.tech AI

Vastus AI-lt

JavaScriptis mitte-kõrge võrdlus (==) teostab tüüpide konversiooni (coercion) operandidele enne võrdlust. Kui operandide tüübid erinevad, püüab JavaScript ühe või mõlemat konverteerida ühte tüüpi, tuginedes mitmele reeglile.

Peamised reeglid == puhul:

  1. Number ja string: String konverteeritakse numbriks. Kui konversioon ebaõnnestub (NaN), on tulemus alati false.
    // "10" konverteeritakse 10-ks. Tulemus: true
    console.log(10 == "10");
    // "abc" konverteeritakse NaN-ks. Tulemus: false
    console.log(10 == "abc");
    
  2. Boolean ja mitte-Boolean: Boolean konverteeritakse numbriks (true 1-ks, false 0-ks). Seejärel võrreldakse numbrit ja teist operandit.
    // true konverteeritakse 1-ks. Tulemus: true
    console.log(true == 1);
    // false konverteeritakse 0-ks. Tulemus: true
    console.log(false == 0);
    // false konverteeritakse 0-ks, "0" konverteeritakse 0-ks. Tulemus: true
    console.log(false == "0");
    
  3. Null ja Undefined: null võrreldakse undefined-iga kui true, ning mitte millegi muuga (välja arvatud iseenda) kui true.
    // Tulemus: true
    console.log(null == undefined);
    // Tulemus: false
    console.log(null == 0);
    // Tulemus: false
    console.log(undefined == 0);
    
  4. Objekt ja primitiiv: Objekt konverteeritakse primitiiviks (kasutades valueOf või toString meetodeid), ning seejärel võrreldakse primitiive.
    // Objekt konverteeritakse stringiks "10" (via toString()), ning võrreldakse numbriga 10
    // "10" konverteeritakse 10-ks. Tulemus: true
    console.log({ toString: () => "10" } == 10);
    
  5. Sümbol ja muu: Sümbolit saab võrrelda ainult teise sümboli või primitiiviga, millele sümbol võib konverteeruda (mis peaaegu alati on võimatu standardjuhtudel).
    // Tulemus: false
    console.log(Symbol('a') == 'a');
    

Mitte-kõrge võrdlus võib viia ootamatute tulemusteni tüübi automaatse konversiooni tõttu. Enam prognoositavaks käitumiseks soovitatakse kasutada range võrdlust (===), mis ei tee tüüpide konversiooni ning võrdleb operandeid otse.