> Что такое NaN и в каких случаях он возникает (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: Инити, Globaldrive
Стек: JavaScript
> Пример ответа
Короткий ответ
NaN (Not-a-Number) - это специальное значение в JavaScript, которое возникает, когда математическая операция не может вернуть корректное число. Типичные случаи: деление 0/0, parseInt('abc'), Math.sqrt(-1), undefined + 5, или явное преобразование нечисловой строки в число. NaN имеет тип number, но не равен самому себе - проверка на NaN выполняется через Number.isNaN().
Подробное объяснение
NaN - это глобальное свойство объекта Number, представляющее результат ошибочной математической операции. В JavaScript NaN ведёт себя необычно:
- Тип: typeof NaN возвращает 'number', что может сбивать с толку
- Самонеравенство: NaN === NaN всегда false - это единственное значение в JS, которое не равно себе
- Распространение: любая операция с NaN возвращает NaN (например, NaN + 5 → NaN)
- Проверка: использовать Number.isNaN() или Object.is(NaN, NaN) - последний корректно возвращает true
Основные причины возникновения:
- Деление нуля на ноль: 0/0
- Неудачное преобразование строки: parseInt('hello'), Number('abc')
- Математические операции с нечисловыми значениями: Math.sqrt(-1), Math.log(-5)
- Арифметика с undefined: 5 + undefined
- Результат операций с NaN: NaN * 10
На практике
В реальной разработке NaN часто появляется при:
- Парсинге пользовательского ввода (например, из формы)
- Работе с API, где поля могут быть null или undefined
- Математических расчётах с некорректными данными
- Сравнении чисел, полученных из разных источников
Важно всегда проверять результат математических операций на NaN перед использованием в вычислениях или отображении. Для этого используйте Number.isNaN(), а не глобальную isNaN(), так как последняя сначала преобразует аргумент к числу, что может дать ложноположительные результаты (например, isNaN('abc') → true, хотя 'abc' - строка, а не NaN).
Пример кода
JAVASCRIPT// Возникновение NaNconsole.log(0 / 0); // NaNconsole.log(parseInt('abc')); // NaNconsole.log(Math.sqrt(-1)); // NaNconsole.log(undefined + 5); // NaNconsole.log(Number('hello')); // NaN// Проверка на NaNconst value = 0 / 0;// Неправильно:console.log(value === NaN); // false - так делать нельзя// Правильно:console.log(Number.isNaN(value)); // trueconsole.log(Object.is(value, NaN)); // true// Опасность глобальной isNaN:console.log(isNaN('строка')); // true - преобразует строку в NaNconsole.log(Number.isNaN('строка')); // false - строка не NaN// Практический примерfunction safeDivide(a, b) {const result = a / b;if (Number.isNaN(result)) {return 'Деление невозможно';}return result;}console.log(safeDivide(10, 2)); // 5console.log(safeDivide(0, 0)); // 'Деление невозможно'
Как отвечать на собеседовании
Начни с чёткого определения NaN как специального числового значения, обозначающего "не число". Приведи 2-3 типичных примера возникновения. Обязательно упомяни ключевую особенность - NaN не равен самому себе. Покажи знание правильного способа проверки через Number.isNaN() и объясни, почему не стоит использовать глобальную isNaN(). Если спросят про тип, скажи, что typeof NaN - 'number', и это исторически сложившаяся особенность. Закончи практическим примером обработки NaN в реальном коде.
Что проверяет интервьюер
- Понимание специальных значений в JavaScript
- Знание особенностей NaN (самонеравенство, тип number)
- Умение правильно проверять на NaN
- Понимание разницы между глобальной isNaN и Number.isNaN
- Способность предвидеть и обрабатывать ошибочные ситуации в коде
Типичные ошибки
- Проверка через value === NaN - это всегда false
- Использование глобальной isNaN() без учёта приведения типов
- Утверждение, что NaN имеет тип undefined или null
- Игнорирование NaN в цепочках вычислений, что приводит к неожиданным результатам
- Путаница между NaN и null/undefined при обработке ошибок
> Похожие задачи по frontend
В чем разница между target и currentTarget в событиях JavaScript?
В чем разница между map и forEach в JavaScript
Что происходит при запуске функции с промисами и почему результат может быть пустым?
Как реализовать глубокое клонирование объекта в JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью