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:
- 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"); - Boolean ja mitte-Boolean: Boolean konverteeritakse numbriks (
true1-ks,false0-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"); - Null ja Undefined:
nullvõrreldakseundefined-iga kuitrue, ning mitte millegi muuga (välja arvatud iseenda) kuitrue.// Tulemus: true console.log(null == undefined); // Tulemus: false console.log(null == 0); // Tulemus: false console.log(undefined == 0); - Objekt ja primitiiv: Objekt konverteeritakse primitiiviks (kasutades
valueOfvõitoStringmeetodeid), 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); - 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.