Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Проверка значения на NaN в JavaScript/TypeScript
NaN (Not-a-Number) — особое значение в JavaScript, которое представляет математически неопределённый результат. Проверка на NaN требует специального подхода, так как `NaN !== NaN`.
Основные методы проверки
1. Number.isNaN() — правильный способ (рекомендуется)
// ✅ Правильно — проверяет именно NaN
Number.isNaN(NaN); // true
Number.isNaN(123); // false
Number.isNaN('text'); // false (не приводит к типам)
Number.isNaN(undefined); // false
// Используй для строгой проверки
const value = parseFloat('abc');
if (Number.isNaN(value)) {
console.log('Ошибка парсинга');
}
2. isNaN() — глобальная функция (избегай!)
// ❌ Неправильно — приводит к типам
isNaN(NaN); // true
isNaN('text'); // true (опасно!)
isNaN(undefined); // true
isNaN(null); // false
// Может привести к неожиданному поведению
if (isNaN(userInput)) { // true даже если это не число!
// ...
}
3. Object.is() — альтернативный вариант
// ✅ Также работает для NaN
Object.is(NaN, NaN); // true
Object.is(0, -0); // false (отличает +0 и -0)
Object.is(123, 123); // true
const checkIsNaN = (value) => Object.is(value, NaN);
4. Сравнение с самим собой
// ✅ Трюк: NaN — единственное значение, не равное самому себе
const isNaN = (value) => value !== value;
isNaN(NaN); // true
isNaN(123); // false
Практические примеры в Node.js
Валидация числовых данных:
function validateNumber(input: any): number {
const num = Number(input);
if (Number.isNaN(num)) {
throw new Error(`Invalid number: ${input}`);
}
return num;
}
validateNumber('42'); // 42
validateNumber('abc'); // Error
validateNumber(null); // 0 (будь внимателен!)
Обработка результатов вычислений:
function calculateDiscount(price: number, percent: number): number {
const discount = (price * percent) / 100;
if (Number.isNaN(discount)) {
throw new Error('Invalid calculation parameters');
}
return price - discount;
}
// Пример ошибки
const result = Math.sqrt(-1); // NaN (квадратный корень из отрицательного)
if (Number.isNaN(result)) {
console.error('Cannot calculate square root of negative number');
}
Парсинг JSON:
function safeParseJSON(json: string): any {
try {
const parsed = JSON.parse(json);
// Проверка на NaN в значениях
if (typeof parsed === 'number' && Number.isNaN(parsed)) {
throw new Error('JSON contains NaN');
}
return parsed;
} catch (error) {
console.error('Parse error:', error);
return null;
}
}
Проверка в TypeScript:
function processValue(value: number): void {
// TypeScript type guard
if (Number.isNaN(value)) {
console.log('Not a number');
return;
}
// value гарантированно number (но не NaN)
const doubled = value * 2;
}
Рекомендации
| Способ | Когда использовать | Примечание |
|---|---|---|
Number.isNaN() | Всегда (стандарт) | Не приводит к типам, самый надёжный |
Object.is() | Когда нужна точность | Правильно различает NaN и ±0 |
isNaN() | Никогда (deprecated) | Опасен, приводит строки к числам |
| Сравнение | Для хака | Работает, но неочевидно |
Золотое правило: используй Number.isNaN() для проверки на NaN в Node.js. Это современный стандарт, безопасен и явен в намерениях.