Sobes.tech
Junior

Šta se dešava u JavaScript-u pri nestrogo poređenje (==)?

sobes.tech АИ

Одговор од АИ

U nesuglasnosti (==) u JavaScript-u, pre poređenja se vrši konverzija tipova (coercion) operanada. Ako se tipovi operanada razlikuju, JavaScript pokušava da konvertuje jedan ili oba operanda u isti tip, na osnovu niza pravila.

Glavna pravila konverzije sa ==:

  1. Broj i niz: Niz se konvertuje u broj. Ako konverzija ne uspe (NaN), rezultat je uvek false.
    // "10" se konvertuje u 10. Rezultat: true
    console.log(10 == "10");
    // "abc" se konvertuje u NaN. Rezultat: false
    console.log(10 == "abc");
    
  2. Boolean i ne-Boolean: Boolean se konvertuje u broj (true u 1, false u 0). Zatim se porede broj i drugi operand.
    // true se konvertuje u 1. Rezultat: true
    console.log(true == 1);
    // false se konvertuje u 0. Rezultat: true
    console.log(false == 0);
    // false se konvertuje u 0, "0" se konvertuje u 0. Rezultat: true
    console.log(false == "0");
    
  3. Null i Undefined: null je jednak undefined kao true, i sa ničim drugim (osim sebe) kao true.
    // Rezultat: true
    console.log(null == undefined);
    // Rezultat: false
    console.log(null == 0);
    // Rezultat: false
    console.log(undefined == 0);
    
  4. Objekat i primitiv: Objekat se konvertuje u primitiv (pomoću valueOf ili toString), a zatim se porede primitivne vrednosti.
    // Objekat se konvertuje u niz "10" (kroz toString()), a zatim se poredi sa brojem 10
    // "10" se konvertuje u 10. Rezultat: true
    console.log({ toString: () => "10" } == 10);
    
  5. Simbol i drugi: Simboli se mogu porediti samo sa drugim simbolima ili primitivnim vrednostima na koje simbol može biti konvertovan (što je u standardnim slučajevima nemoguće).
    // Rezultat: false
    console.log(Symbol('a') == 'a');
    

Ne-škrto poređenje može dovesti do neočekivanih rezultata zbog automatske konverzije tipova. Za predvidljivije ponašanje preporučuje se korišćenje stroge poređenja (===), koje ne vrši konverziju tipova i direktno poredi operande.