Операторы сравнения JavaScript
Операторы сравнения позволяют проверять отношения между значениями и возвращают логическое значение — true или false. В JavaScript важно понимать разницу между нестрогим и строгим сравнением, а также то, как язык приводит типы автоматически.
Нестрогое сравнение: == и !=
Операторы == (равно) и != (не равно) выполняют приведение типов перед сравнением. Это означает, что JavaScript пытается преобразовать операнды к одному типу, чтобы сделать сравнение возможным.
Примеры:
console.log(5 == "5"); // true — строка "5" приводится к числу 5
console.log(true == 1); // true — true приводится к 1
console.log(false == 0); // true — false приводится к 0
console.log("" == 0); // true — пустая строка приводится к 0
console.log(null == undefined); // true — особое правило: null и undefined равны друг другу
Почему это проблема?
console.log("0" == false); // true — "0" → 0, false → 0 → 0 == 0
console.log([] == false); // true — пустой массив → "" → 0 → false → 0
Такие поведения могут привести к скрытым багам, особенно при обработке пользовательского ввода или данных из API.
✅ Правило: Избегайте
==и!=в production-коде.
Строгое сравнение: === и !==
Операторы === (строго равно) и !== (строго не равно) не выполняют приведение типов. Сравниваются и значение, и тип.
Примеры:
console.log(5 === "5"); // false — разные типы: число и строка
console.log(true === 1); // false — boolean и number
console.log(5 === 5); // true — одинаковые тип и значение
console.log(null === undefined); // false — разные типы
console.log("" === 0); // false — строка не равна числу
Рекомендация:
Всегда используйте === и !==, если вам нужно точное совпадение.
// Хорошо
if (userInput === "yes") { ... }
// Плохо
if (userInput == "yes") { ... } // Может сработать на 1, true, "1"
Операторы больше/меньше: >, <, >=, <=
Эти операторы сравнивают значения по величине. При сравнении разных типов JavaScript также применяет приведение, но по другим правилам.
Сравнение чисел:
console.log(10 > 5); // true
console.log(3 <= 3); // true
Сравнение строк:
Строки сравниваются по символам, в лексикографическом порядке (как в словаре):
console.log("apple" < "banana"); // true — 'a' < 'b'
console.log("Z" < "a"); // true — в ASCII 'Z' (90) < 'a' (97)
console.log("10" < "2"); // true — потому что "1" < "2", сравнение по первому символу!
❗ Важно:
"10" < "2"даётtrue, хотя числово 10 > 2.
Это частая ошибка при сравнении строковых чисел.
Как правильно сравнивать числа, представленные как строки?
Приведите их к числу:
console.log(Number("10") < Number("2")); // false
// или проще:
console.log(+ "10" < + "2"); // false
Примеры неожиданного поведения и как их избегать
| Пример | Результат | Почему? | Как исправить |
|---|---|---|---|
"" == 0 |
true |
Пустая строка → 0 | Используйте === |
"0" == false |
true |
"0" → 0, false → 0 | Замените на === |
"5" > 3 |
true |
"5" → 5, потом сравнение чисел | Корректно, но лучше явно преобразовывать |
"10" < "2" |
true |
Сравнение по символам: "1" < "2" | Преобразуйте в число: + "10" < + "2" |
null > 0 |
false |
null → 0, но null > 0 — false |
Не полагайтесь на неявное приведение |