Sobes.tech
Junior

Kas vyksta JavaScript, kai atliekamas negriežtas palyginimas (==)?

sobes.tech AI

Atsakymas iš AI

JavaScript'e negriežtā salīdzināšana (==) veic tipu pārvēršanu (coercion) operandiem pirms salīdzināšanas. Ja operandu tipi atšķiras, JavaScript mēģina vienu vai abus pārvērst vienā tipā, balstoties uz vairākām noteikumiem.

Galvenie noteikumi, kas attiecas uz ==:

  1. Skaitlis un virkne: Virkne tiek pārvērsta skaitlī. Ja pārvēršana neizdodas (NaN), rezultāts vienmēr ir false.
    // "10" tiek pārvērsts par 10. Rezultāts: true
    console.log(10 == "10");
    // "abc" tiek pārvērsts par NaN. Rezultāts: false
    console.log(10 == "abc");
    
  2. Boolean un ne-Boolean: Boolean tiek pārvērsts par skaitli (true uz 1, false uz 0). Tad tiek salīdzināts skaitlis un cits operands.
    // true tiek pārvērsts uz 1. Rezultāts: true
    console.log(true == 1);
    // false tiek pārvērsts uz 0. Rezultāts: true
    console.log(false == 0);
    // false tiek pārvērsts uz 0, "0" tiek pārvērsts uz 0. Rezultāts: true
    console.log(false == "0");
    
  3. Null un Undefined: null tiek salīdzināts ar undefinedtrue, un ar neko citu (izņemot sevi) kā true.
    // Rezultāts: true
    console.log(null == undefined);
    // Rezultāts: false
    console.log(null == 0);
    // Rezultāts: false
    console.log(undefined == 0);
    
  4. Objekts un primitives: Objekts tiek pārvērsts par primitivu (izmantojot valueOf vai toString metodes), tad tiek salīdzināti primitivie.
    // Objekts tiek pārvērsts par virkni "10" (caur toString()), tad tiek salīdzināts ar skaitli 10
    // "10" tiek pārvērsts uz 10. Rezultāts: true
    console.log({ toString: () => "10" } == 10);
    
  5. Simbols un cits: Simbolu var salīdzināt tikai ar citu simbolu vai primitivu, kam simbols var tikt pārvērsts (kas būtībā ir neiespējami standarta gadījumos).
    // Rezultāts: false
    console.log(Symbol('a') == 'a');
    

Negrieztā salīdzināšana var novest pie negaidītiem rezultātiem, jo notiek tipu automātiska pārvēršana. Lai būtu paredzamāks uzvedība, ieteicams izmantot stingro salīdzinājumu (===), kas neveic tipu pārvēršanu un tieši salīdzina operandus.