Вопрос проверяет понимание особенностей числовой модели JavaScript и стандарта IEEE 754.
NaN означает “не число” и по спецификации не равен ничему, включая самого себя. Это сделано для отражения ошибок вычислений, а не конкретного значения. Поэтому любое сравнение NaN через == или === возвращает false. Для проверки NaN используются специальные методы.
Поведение NaN кажется странным, но оно намеренное.
Определение: NaN — специальное числовое значение, обозначающее некорректный результат вычислений.
NaN не представляет конкретное число, а сигнализирует об ошибке:
деление строки на число
результат 0 / 0
некорректные математические операции
Если бы NaN === NaN было true, это могло бы скрывать ошибки в вычислениях.
const a = Number('abc');
a === a; // false
Number.isNaN(value) — рекомендуемый способ
глобальная isNaN() — приводит типы и может вводить в заблуждение
Number.isNaN(NaN); // true
Number.isNaN('text'); // false
Вывод: NaN !== NaN, потому что NaN — это маркер ошибки, а не обычное значение, и сравнение с ним всегда ложно.