Sobes.tech
Junior

Co się dzieje w JavaScript podczas nieścisłego porównania (==)?

sobes.tech AI

Odpowiedź od AI

W porównaniu nieściśle (==) w JavaScript wykonywana jest konwersja typów (coercion) operandów przed porównaniem. Jeśli typy operandów się różnią, JavaScript próbuje przekonwertować jeden lub oba operandy na ten sam typ, opierając się na szeregu reguł.

Główne zasady konwersji przy ==:

  1. Liczba i łańcuch: Łańcuch jest konwertowany na liczbę. Jeśli konwersja się nie powiedzie (NaN), wynik zawsze jest false.
    // "10" konwertuje się na 10. Wynik: true
    console.log(10 == "10");
    // "abc" konwertuje się na NaN. Wynik: false
    console.log(10 == "abc");
    
  2. Boolean i nie-Boolean: Boolean jest konwertowany na liczbę (true na 1, false na 0). Następnie porównuje się liczbę i drugi operand (który może być konwertowany).
    // true konwertuje się na 1. Wynik: true
    console.log(true == 1);
    // false konwertuje się na 0. Wynik: true
    console.log(false == 0);
    // false konwertuje się na 0, "0" konwertuje się na 0. Wynik: true
    console.log(false == "0");
    
  3. Null i Undefined: null jest równe undefined jako true, i z niczym innym (z wyjątkiem siebie samego) jako true.
    // Wynik: true
    console.log(null == undefined);
    // Wynik: false
    console.log(null == 0);
    // Wynik: false
    console.log(undefined == 0);
    
  4. Obiekt i prymityw: Obiekt jest konwertowany na prymityw (za pomocą metod valueOf lub toString), a następnie porównywane są prymitywy.
    // Obiekt konwertuje się na łańcuch "10" (przez toString()), a potem porównuje się z liczbą 10
    // "10" konwertuje się na 10. Wynik: true
    console.log({ toString: () => "10" } == 10);
    
  5. Symbol i inny: Symbol można porównać tylko z innym symbolem lub prymitywem, do którego symbol może być konwertowany (co w standardowych przypadkach jest niemożliwe).
    // Wynik: false
    console.log(Symbol('a') == 'a');
    

Porównanie nieściśle może prowadzić do nieoczekiwanych wyników z powodu automatycznej konwersji typów. Dla bardziej przewidywalnego zachowania zaleca się używanie porównania ścisłego (===), które nie wykonuje konwersji typów i porównuje operandów bezpośrednio.