> Как реализовать функцию 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 === NaNfalse.
  • Любое другое значение (включая 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)); // true
console.log(isNaNStrict('abc')); // false (строка не приводится)
console.log(isNaNGlobal('abc')); // true (приводится к NaN)
console.log(isNaNGlobal(undefined)); // true
console.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 уже покрывает случай нечисловых значений (они равны себе).

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

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