В двух словах
NaN (Not a Number) — специальное числовое значение, которое означает «результат не является корректным числом». Тип при этом — number.
typeof NaN;
Number("oops");
0 / 0;
Math.sqrt(-1);
Глобальное свойство NaN (и Number.NaN) указывает на это значение.
Уникальное поведение
NaN === NaN;
Object.is(NaN, NaN);
Number.isNaN(NaN);
Любая арифметика с NaN обычно снова даёт NaN («заражение»).
Откуда берётся на фронте
Парсинг ввода пользователя, parseInt("abc"), невалидный JSON number, операции с undefined.
const n = Number(input.value);
if (Number.isNaN(n)) {
showError("Введите число");
}
Итог: NaN — числовой «мусорный» результат невалидных операций; проверяйте через Number.isNaN, не через ===.