← Все вопросы

В чём разница между == и === в JavaScript и что использовать?

Задан 15 месяцев назад686 просмотров2 ответа
11

Вижу в чужом коде то ==, то ===. Когда сравниваю 0 == '' получаю true, а 0 === '' — false. Запутался: в чём разница между двойным и тройным равно и какой оператор брать?

2 ответа

15
✓ Принятый ответ — помог автору

Коротко: === сравнивает строго (значение И тип), == сравнивает с приведением типов (молча преобразует операнды). Почти всегда нужно ===.

=== (строгое): если типы разные — сразу false, без преобразований:

5 === 5;     // true
5 === '5';   // false — число и строка
0 === false; // false — число и булево

== (нестрогое): перед сравнением приводит типы по запутанным правилам, отсюда странности:

5 == '5';      // true — строка превратилась в число
0 == '';       // true — оба стали 0
0 == false;    // true
null == undefined; // true
'' == false;   // true

Именно из-за этих сюрпризов == считается источником багов.

Что использовать: по умолчанию всегда ===!==). Код становится предсказуемым: сравнение '5' === 5 честно даст false, и ты заметишь, что забыл преобразовать строку в число.

Единственное оправданное ==: проверка «null или undefined одним махом»:

if (x == null) {
  // true и для null, и для undefined
}

Но это скорее редкий приём, чем правило.

Практический вывод твоего примера: 0 == '' это true, потому что == приводит оба к числу 0. А 0 === '' это false, потому что число и строка — разные типы. Бери ===, и таких загадок не будет.

5

Памятка: думай о === как о «сравни честно, без магии», а о == — как «сравни, но сначала тайком всё переделай в один тип».

Линтеры (ESLint) по умолчанию ругаются на == и просят === — это общепринятая практика. Если включишь правило eqeqeq, оно само подсветит все нестрогие сравнения в проекте.

Ваш ответ

Войдите, чтобы ответить на вопрос.