> Что такое NaN и в каких случаях он возникает (JavaScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: Сбер

Стек: JavaScript

> Пример ответа

Короткий ответ

NaN (Not-a-Number) - это специальное значение в JavaScript, которое обозначает результат математической операции, не дающей корректное число. Оно возникает при некорректных арифметических операциях, например, при делении 0/0, при попытке преобразовать строку в число через Number("abc"), или при использовании parseInt с некорректным аргументом. Важно помнить, что NaN не равен самому себе, поэтому для проверки используется Number.isNaN().

Подробное объяснение

NaN - это глобальное свойство, представляющее значение "не число". В JavaScript оно имеет тип number, что часто сбивает с толку. Основные сценарии возникновения:

  1. Некорректные математические операции: 0 / 0, Math.sqrt(-1), Math.log(-1).
  2. Неявное преобразование типов: "abc" * 2, "5" - "x" - когда строка не может быть преобразована в число.
  3. Явное преобразование: Number("hello"), parseInt("abc") (если первый символ не цифра).
  4. Передача некорректного аргумента в математические функции: Math.max() без аргументов, Math.pow("x", 2).

Ключевая особенность - NaN не равен самому себе: NaN === NaN возвращает false. Это связано с тем, что по стандарту IEEE 754, NaN не может быть сравнен с любым другим значением, включая себя. Для проверки используют Number.isNaN(value) (строгая проверка) или глобальную функцию isNaN(value) (с приведением типов, что может давать ложные срабатывания, например, isNaN("abc") вернёт true).

На практике

В реальной разработке NaN часто возникает при работе с пользовательским вводом, парсингом данных или вычислениями. Например, при получении числа из input-поля через parseInt без проверки результата. Также NaN может "заразить" все последующие вычисления: если одно значение в цепочке операций становится NaN, результат всей цепочки будет NaN.

Чтобы избежать проблем, нужно:

  • Всегда проверять результат парсинга: const num = parseInt(value); if (!Number.isNaN(num)) { ... }.
  • Использовать Number.isNaN() вместо глобальной isNaN() для точной проверки.
  • При работе с дробными вычислениями помнить, что NaN может появиться из-за переполнения или деления на ноль.

Пример кода

JAVASCRIPT
// Возникновение NaN
console.log(0 / 0); // NaN
console.log(Math.sqrt(-1)); // NaN
console.log(Number("abc")); // NaN
console.log(parseInt("xyz")); // NaN
console.log("hello" * 2); // NaN
// Проверка на NaN
const value = NaN;
console.log(value === NaN); // false - так нельзя проверять!
console.log(Number.isNaN(value)); // true - правильно
// Опасность глобальной isNaN
console.log(isNaN("abc")); // true - но это строка, не NaN
console.log(Number.isNaN("abc")); // false - строка не является NaN
// Пример из практики
function safeParseNumber(input) {
const num = Number(input);
if (Number.isNaN(num)) {
return 0; // или другое значение по умолчанию
}
return num;
}

Как отвечать на собеседовании

Начни с определения: NaN - это специальное значение, обозначающее "не число", которое появляется при некорректных математических операциях. Перечисли основные случаи возникновения: деление нуля на ноль, некорректное преобразование строк, математические функции с недопустимыми аргументами. Обязательно упомяни ключевую особенность - NaN !== NaN, и объясни, почему это так (стандарт IEEE 754). Покажи, как правильно проверять на NaN через Number.isNaN(), и объясни разницу с глобальной isNaN(). Если спросят про тип - скажи, что NaN имеет тип number, но не является корректным числом. Хорошо добавить пример из практики, например, обработку пользовательского ввода.

Что проверяет интервьюер

Интервьюер оценивает:

  • Понимание базовых механизмов JavaScript, связанных с типами данных.
  • Знание особенностей NaN и способов его проверки.
  • Умение объяснить разницу между isNaN() и Number.isNaN().
  • Способность предвидеть ситуации, где NaN может возникнуть в реальном коде.
  • Понимание того, как NaN "распространяется" по цепочке вычислений.

Типичные ошибки

  • Утверждение, что NaN имеет тип undefined или null - на самом деле тип number.
  • Использование value === NaN для проверки - это всегда false.
  • Путаница между глобальной isNaN() и Number.isNaN(): первая приводит аргумент к числу, вторая - нет.
  • Игнорирование проверки результата parseInt или Number при работе с пользовательским вводом.
  • Утверждение, что NaN возникает при делении на ноль в любом случае - на самом деле 5 / 0 даёт Infinity, а не NaN.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью