> Как реализовать функцию isNaN без использования Object.is в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Инити
Стек: JavaScript
> Пример ответа
Короткий ответ
Функция isNaN проверяет, является ли значение NaN после приведения к числу. Реализовать её можно через глобальную функцию Number.isNaN (строгая проверка без приведения) или вручную: function isNaN(value) { return value !== value; }. Однако важно помнить, что NaN - единственное значение, не равное самому себе, поэтому проверка value !== value работает только для строгого сравнения без приведения типов. Для полной имитации глобальной isNaN нужно сначала привести значение к числу: Number(value) !== Number(value).
Подробное объяснение
Глобальная isNaN сначала преобразует аргумент в число через Number(), затем проверяет результат. Например, isNaN('abc') вернёт true, потому что Number('abc') даёт NaN. В отличие от неё, Number.isNaN не выполняет приведение - она возвращает true только если аргумент уже является NaN.
Реализация без Object.is может опираться на свойства NaN:
NaNне равен самому себе:NaN === NaN→false.- Любое другое значение (включая
null,undefined, строки, объекты) при строгом сравнении с собой даётtrue.
Для строгой версии достаточно: function isNaNStrict(value) { return value !== value; }.
Для имитации глобальной версии нужно сначала привести значение: function isNaNGlobal(value) { const num = Number(value); return num !== num; }.
Важно: Number(null) → 0, Number(undefined) → NaN, поэтому isNaN(undefined) → true, а isNaN(null) → false.
На практике
В реальном коде обычно используют Number.isNaN для строгой проверки, чтобы избежать неожиданного приведения типов. Если нужно воспроизвести поведение глобальной isNaN, лучше использовать встроенную функцию, а не самописную реализацию - она уже оптимизирована и покрывает все edge cases.
Самописная реализация полезна для понимания механики, но в production-коде её заменяют на Number.isNaN или value !== value (если точно известно, что значение уже число).
Пример кода
JAVASCRIPT// Строгая проверка (аналог Number.isNaN)function isNaNStrict(value) {return value !== value;}// Имитация глобальной isNaN (с приведением типов)function isNaNGlobal(value) {const num = Number(value);return num !== num;}// Проверкаconsole.log(isNaNStrict(NaN)); // trueconsole.log(isNaNStrict('abc')); // false (строка не приводится)console.log(isNaNGlobal('abc')); // true (приводится к NaN)console.log(isNaNGlobal(undefined)); // trueconsole.log(isNaNGlobal(null)); // false (Number(null) === 0)
Как отвечать на собеседовании
Начни с ключевого отличия: глобальная isNaN приводит аргумент к числу, а Number.isNaN - нет. Затем покажи реализацию через value !== value, объяснив, почему это работает (единственное значение, не равное себе). Упомяни, что для полной имитации глобальной версии нужно использовать Number(value). Подчеркни, что в реальном коде лучше использовать встроенные функции, а самописная реализация - учебный пример.
Что проверяет интервьюер
- Понимание разницы между
isNaNиNumber.isNaN. - Знание особенностей
NaN(не равен самому себе). - Умение работать с приведением типов.
- Понимание edge cases:
null,undefined, строки, объекты. - Способность объяснить, почему
value !== value- корректная проверка.
Типичные ошибки
- Использование
value == NaN- всегдаfalse, так какNaNне равен ничему, включая себя. - Забыть про приведение типов в глобальной
isNaN- тогдаisNaN('abc')вернётfalseвместоtrue. - Путать
isNaNиNumber.isNaNв ответе. - Предлагать
typeof value === 'number' && value !== value- избыточно, так какvalue !== valueуже покрывает случай нечисловых значений (они равны себе).
> Похожие задачи по frontend
Как добавить числовое свойство в объект в JavaScript
Как сделать функцию вызываемой через точку в JavaScript
Как измеряется и описывается сложность алгоритмов
Сколько раз выполнится console.log в цикле с использованием оператора остатка от деления в JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью