> Что такое NaN и в каких случаях он возникает (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: Сбер
Стек: JavaScript
> Пример ответа
Короткий ответ
NaN (Not-a-Number) - это специальное значение в JavaScript, которое обозначает результат математической операции, не дающей корректное число. Оно возникает при некорректных арифметических операциях, например, при делении 0/0, при попытке преобразовать строку в число через Number("abc"), или при использовании parseInt с некорректным аргументом. Важно помнить, что NaN не равен самому себе, поэтому для проверки используется Number.isNaN().
Подробное объяснение
NaN - это глобальное свойство, представляющее значение "не число". В JavaScript оно имеет тип number, что часто сбивает с толку. Основные сценарии возникновения:
- Некорректные математические операции:
0 / 0,Math.sqrt(-1),Math.log(-1). - Неявное преобразование типов:
"abc" * 2,"5" - "x"- когда строка не может быть преобразована в число. - Явное преобразование:
Number("hello"),parseInt("abc")(если первый символ не цифра). - Передача некорректного аргумента в математические функции:
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// Возникновение NaNconsole.log(0 / 0); // NaNconsole.log(Math.sqrt(-1)); // NaNconsole.log(Number("abc")); // NaNconsole.log(parseInt("xyz")); // NaNconsole.log("hello" * 2); // NaN// Проверка на NaNconst value = NaN;console.log(value === NaN); // false - так нельзя проверять!console.log(Number.isNaN(value)); // true - правильно// Опасность глобальной isNaNconsole.log(isNaN("abc")); // true - но это строка, не NaNconsole.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.
> Похожие задачи по frontend
Как перехватывать ошибки в промисах и чем это отличается от try-catch
Какой опыт работы с JavaScript
Какая конструкция может использоваться вместе с try-catch в JavaScript
Какой метод вызывается при наследовании, если метод определён в прототипе родителя и в экземпляре дочернего класса в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью