В чём разница между == и === в JavaScript и что использовать?
Вижу в чужом коде то ==, то ===. Когда сравниваю 0 == '' получаю true, а 0 === '' — false. Запутался: в чём разница между двойным и тройным равно и какой оператор брать?
2 ответа
Коротко: === сравнивает строго (значение И тип), == сравнивает с приведением типов (молча преобразует операнды). Почти всегда нужно ===.
=== (строгое): если типы разные — сразу 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, потому что число и строка — разные типы. Бери ===, и таких загадок не будет.
Памятка: думай о === как о «сравни честно, без магии», а о == — как «сравни, но сначала тайком всё переделай в один тип».
Линтеры (ESLint) по умолчанию ругаются на == и просят === — это общепринятая практика. Если включишь правило eqeqeq, оно само подсветит все нестрогие сравнения в проекте.