Почему `NaN` всё-таки относится к числам

Название `NaN` расшифровывается как «не число», но в JavaScript это не отдельный тип. Это специальное значение типа `number` — наряду с обычными числами и бесконечностью. Поэтому `typeof NaN` возвращает `"number"`: оператор сообщает тип значения, а не то, получилось ли из него осмысленное количество.

Так устроен результат некоторых вычислений. Например, попытка преобразовать неподходящую строку в число или вычесть одно бесконечное значение из другого может дать `NaN`. Вместо остановки программы JavaScript помещает в результат этот маркер: вычисление продолжается, а код может проверить, не возникла ли ошибка.

Как ведёт себя маркер ошибки

Если `NaN` участвует в дальнейшей арифметике, результат обычно тоже становится `NaN`. Так неудачный промежуточный расчёт не маскируется случайным числом: он передаётся дальше по цепочке вычислений.

У этого значения есть необычное свойство: оно не равно даже самому себе. Поэтому проверка `x === NaN` не сработает. Для проверки используют `Number.isNaN(x)`, которая отвечает именно на вопрос, является ли значение `NaN`, не смешивая его с другими данными. `NaN` — не отсутствие числового типа, а числовой сигнал о том, что вычисление не дало обычного результата.