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 ==:
- 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"); - Boolean i nie-Boolean: Boolean jest konwertowany na liczbę (
truena 1,falsena 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"); - Null i Undefined:
nulljest równeundefinedjakotrue, i z niczym innym (z wyjątkiem siebie samego) jakotrue.// Wynik: true console.log(null == undefined); // Wynik: false console.log(null == 0); // Wynik: false console.log(undefined == 0); - Obiekt i prymityw: Obiekt jest konwertowany na prymityw (za pomocą metod
valueOflubtoString), 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); - 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.