Вопрос проверяет знание правил нестрогого сравнения и процесса приведения объекта к примитиву.
При сравнении объекта с числом оператор == пытается привести объект к примитиву. Для этого вызываются методы valueOf и toString. Если результат приведения не совпадает с числом, сравнение возвращает false. Поведение может выглядеть неожиданно, но оно строго определено спецификацией.
Когда в сравнении участвует объект, JavaScript сначала пытается превратить его в примитив.
Определение: ToPrimitive — алгоритм приведения объекта к примитивному значению перед операциями вроде ==.
При выражении:
obj == 1
JavaScript делает следующее:
Видит, что один операнд — объект.
Запускает приведение объекта к примитиву.
Сравнивает получившийся примитив с числом.
const obj = { value: 1 };
obj == 1; // false
Почему:
obj.valueOf() → возвращает сам объект
obj.toString() → "[object Object]"
строка "[object Object]" не равна 1
const obj = {
valueOf() {
return 1;
}
};
obj == 1; // true
поведение неочевидно
легко получить баг в условиях
код сложно читать и поддерживать
избегать == при сравнении объектов
использовать ===
явно приводить типы при необходимости
Вывод: объект не равен числу при ==, потому что JavaScript сначала приводит объект к примитиву, и результат этого приведения чаще всего не совпадает с числом.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию