Сегодня я отлаживал устаревший код и в итоге обнаружил странную ошибку. Это было вызвано простым «==».

В Javascript у нас есть четыре алгоритма равенства, но мы используем в основном два: абстрактное равенство или свободное равенство (==) и строгое равенство (===).

Абстрактное равенство (==) - зло, не используйте его. Предположим, у нас есть это:

let a = "1";
let b = 1;
let c = "1.0";
console.log(a); // output 1
console.log(b); // output 1
console.log(c); // output 1

Проведем несколько сравнений:

console.log(a == b); // output true
console.log(b == c); // output true

Пока все хорошо, теперь давайте проверим следующее:

console.log(a == c); // 

Конечно результат верный, правда? Ответ - нет. Абстрактное равенство (==) выполняет сравнение по преобразованию. Пожалуйста, больше не используйте ==. Вместо этого используйте строгое равенство (===).

console.log(a === b); // output false
console.log(b === c); // output false
console.log(a === c); // output false

Абстрактное равенство (==) сравнивает два значения на равенство после преобразования обоих значений в общий тип. После преобразований (одна или обе стороны могут претерпеть преобразования) окончательное сравнение равенства выполняется точно так же, как его выполняет Строгое равенство (===). (от MDN)

Строгое равенство (===) сравнивает два значения на равенство. Ни одно из значений не будет неявно преобразовано в какое-либо другое значение перед сравнением. Если значения имеют разные типы, значения считаются неравными. В противном случае, если значения имеют один и тот же тип и не являются числами, они считаются равными, если имеют одинаковое значение. Наконец, если оба значения являются числами, они считаются равными, если они оба не NaN и имеют одно и то же значение, или если одно из них равно +0, а другое --0. (от MDN)

Спасибо!