Operatory porównania w JavaScript to podstawowe narzędzia do sprawdzania relacji między wartościami (równość, nierówność, większe/mniejsze). Zawsze zwracają wartość logiczną true lub false, dzięki czemu są kluczowe w instrukcjach warunkowych if, else if i else.
W tym przewodniku poznasz pełną listę operatorów, różnice między porównaniem luźnym a ścisłym, praktyczne przykłady, pułapki związane z koercją typów oraz dobre praktyki. Nauczysz się pisać bezpieczniejszy, bardziej przewidywalny kod.
Lista wszystkich operatorów porównania
Poniższa tabela zbiera osiem podstawowych operatorów porównań w JavaScript wraz z krótkim opisem i przykładem:
| Operator | Nazwa | Opis | Przykład | Wynik |
|---|---|---|---|---|
== |
Równość (luźna) | Porównuje po konwersji typów | 5 == '5' |
true |
!= |
Nierówność (luźna) | Porównuje po konwersji typów | 5 != '5' |
false |
=== |
Równość ścisła | Porównuje wartość i typ | 5 === '5' |
false |
!== |
Nierówność ścisła | Różna wartość lub typ | 5 !== '5' |
true |
> |
Większy niż | Lewa strona > prawa strona | 5 > 3 |
true |
< |
Mniejszy niż | Lewa strona < prawa strona | 3 < 5 |
true |
>= |
Większy lub równy | Lewa strona >= prawa strona | 5 >= 5 |
true |
<= |
Mniejszy lub równy | Lewa strona <= prawa strona | 5 <= 5 |
true |
Operatory porównania mają określony priorytet w wyrażeniach i zawsze zwracają boolean.
Luźne porównanie (== i !=) vs ścisłe (=== i !==) – kluczowa różnica
Największą pułapką dla początkujących jest koercja typów, czyli automatyczna konwersja zachodząca przy == i !=. Próba dopasowania typów może prowadzić do zaskakujących rezultatów.
Przykład luźnego porównania:
console.log(5 == '5'); // true – '5' konwertowane na 5
console.log(true == 1); // true – true konwertowane na 1
console.log(0 == false); // true – false konwertowane na 0
console.log('' == 0); // true – pusty string na 0
console.log(null == undefined); // true – specjalny przypadek
Przykład ścisłego porównania:
console.log(5 === '5'); // false – różne typy (number vs string)
console.log(true === 1); // false
console.log(0 === false); // false
console.log('' === 0); // false
console.log(null === undefined); // false
Najlepsza praktyka: zawsze używaj === i !==. Są bezpieczniejsze, bardziej czytelne i eliminują błędy wynikające z niejawnej konwersji typów.
Porównywanie liczb i stringów
Dla liczb operatory działają intuicyjnie:
let x = 10;
let y = 5;
console.log(x > y); // true
console.log(x <= y); // false
Stringi porównywane są leksykograficznie (alfabetycznie, według kodów Unicode):
console.log('apple' < 'banana'); // true – 'a' < 'b'
console.log('Z' > 'a'); // false – wielkie litery mają mniejsze kody Unicode niż małe
console.log('10' < '2'); // true – '1' < '2' (nie numerycznie!)
Uwaga: '10' < '2' zwraca true, ponieważ porównuje się znaki, nie wartości liczbowe. Do porównań numerycznych użyj parseInt() lub Number().
Porównywanie booleanów, null i undefined
Booleany: dla porównań luźnych true == 1, a false == 0; porównania ścisłe === rozróżniają typy, więc nie uznają ich za równe liczbom.
null i undefined: tylko w porównaniu luźnym null == undefined jest true; w porównaniu ścisłym null === undefined to false. null oznacza „brak wartości”, a undefined – „niezainicjalizowaną zmienną”.
Przykład zachowania w porównaniach numerycznych:
console.log(null > 0); // false
console.log(null == 0); // false – null nie jest konwertowany do 0 w ==
console.log(undefined == 0); // false
Porównywanie obiektów i tablic
Operatory porównania nie porównują zawartości obiektów, a jedynie referencje (adres w pamięci).
let a = { x: 1 };
let b = { x: 1 };
console.log(a == b); // false – różne obiekty
console.log(a === b); // false
let c = a;
console.log(a === c); // true – ta sama referencja
Do porównań zawartości użyj np. JSON.stringify() (proste przypadki) lub bibliotek typu Lodash.
Praktyczne przykłady użycia w kodzie
Instrukcje warunkowe:
let wiek = 18;
let maPrawoJazdy = wiek >= 18; // true
if (wiek >= 18 && wiek < 65) {
console.log("Możesz pracować!");
} else if (wiek < 18) {
console.log("Jesteś nieletni.");
} else {
console.log("Emerytura!");
}
Walidacja formularza:
let email = "[email protected]";
let haslo = "pass123";
if (haslo.length >= 8 && haslo !== "12345678") { // Ścisłe porównanie
console.log("Hasło OK");
} else {
console.log("Hasło za słabe");
}
Pętla z warunkiem:
for (let i = 0; i < 10; i++) {
if (i > 5) {
console.log("Duże i:", i);
}
}
Pułapki i błędy początkujących
Oto najczęstsze problemy, na które warto uważać:
- Nieoczekiwana koercja –
[] == falsezwracatrue(pusty array konwertowany do ”), unikaj==; - NaN –
NaN === NaNtofalse, użyjNumber.isNaN()lubisNaN(); - Stringi numeryczne –
'02' < '10'totrue(porównanie leksykograficzne); - Łańcuchowanie porównań –
1 < 2 < '3'totrue(bo1 < 2→true→1, a potem1 < '3'→true).
Dobre praktyki i wskazówki
Stosuj poniższe zasady, aby pisać przewidywalny i czytelny kod:
- Używaj zawsze === i !== – to standard w nowoczesnym JS;
- Konwertuj typy jawnie – np.
Number(str) === 5zamiast porównań luźnych; - Testuj edge case’y –
null,undefined,NaN, puste stringi; - Wykorzystuj ES6+ –
Object.is(a, b)do precyzyjnych porównań (rozróżnia0i-0, aObject.is(NaN, NaN)zwracatrue); - Debuguj w konsoli –
console.log(typeof x, x === y).
Podsumowanie kluczowych zasad
Krótka ściąga z wyboru właściwego podejścia w najczęstszych sytuacjach:
| Sytuacja | Użyj | Dlaczego |
|---|---|---|
| Bezpieczne porównanie | === / !== |
Brak konwersji, czytelny kod |
| Porównanie stringów | > / < |
Porządek leksykograficzny |
| Obiekty i tablice | Porównanie referencji | Do zawartości użyj deep equal |
| Liczby vs stringi | Jawna konwersja + === |
Unikasz pułapek koercji |
Ćwicz na własnym kodzie! Otwórz konsolę przeglądarki (F12) i testuj przykłady – im szybciej opanujesz operatory porównań, tym mniej błędów pojawi się w Twoich warunkach.






