Learn JavaScript

isFinite() - глобальная функция для проверки конечного числа в JavaScript

isFinite() проверяет, превращается ли значение в конечное число.

Это глобальная функция JavaScript. Она сначала приводит значение к числу, а потом проверяет, не равно ли оно NaN, Infinity или -Infinity.

Синтаксис

isFinite(value)

value - значение, которое нужно проверить.

Что делает isFinite()

Функция пытается получить из значения число и потом отвечает: это конечное число или нет.

console.log(isFinite(123));      // true
console.log(isFinite("123"));    // true
console.log(isFinite(Infinity)); // false
console.log(isFinite(NaN));      // false

Из-за автоматического приведения типов isFinite() работает мягче, чем Number.isFinite().

Что возвращает isFinite()

isFinite() всегда возвращает булево значение:

  • true, если после приведения получилось конечное число
  • false, если получилось NaN, Infinity или -Infinity
console.log(isFinite(10));         // true
console.log(isFinite("10"));       // true
console.log(isFinite(-Infinity));  // false

Неявное приведение типов

Это главный нюанс функции.

isFinite() не проверяет значение “как есть”, а сначала пытается превратить его в число.

console.log(isFinite("123")); // true
console.log(isFinite(null));  // true
console.log(isFinite(true));  // true

Почему так:

  • "123" превращается в 123
  • null превращается в 0
  • true превращается в 1

Поэтому результат может выглядеть неожиданно, если ждать строгой проверки.

isFinite() и Number.isFinite()

Это самая важная пара для сравнения.

console.log(isFinite("123"));        // true
console.log(Number.isFinite("123")); // false
  • isFinite() сначала приводит значение к числу
  • Number.isFinite() ничего не приводит и проверяет только готовое число

Ещё пример:

console.log(isFinite(null));        // true
console.log(Number.isFinite(null)); // false

Если нужна строгая и предсказуемая проверка, чаще лучше Number.isFinite().

isFinite() и Number()

По сути, isFinite() ведёт себя так, как будто внутри сначала вызывается Number().

console.log(Number("123")); // 123
console.log(isFinite("123")); // true

А здесь результат уже другой:

console.log(Number("hello")); // NaN
console.log(isFinite("hello")); // false

Неожиданные примеры

Вот случаи, которые чаще всего сбивают с толку:

console.log(isFinite(""));     // true
console.log(isFinite(" "));    // true
console.log(isFinite(null));   // true
console.log(isFinite([]));     // true
console.log(isFinite([123]));  // true
console.log(isFinite([1, 2])); // false
console.log(isFinite({}));     // false

Все эти результаты связаны именно с автоматическим приведением типов.

Infinity и NaN

Если после приведения получается NaN, Infinity или -Infinity, функция вернёт false.

console.log(isFinite(NaN));        // false
console.log(isFinite(Infinity));   // false
console.log(isFinite(-Infinity));  // false

Это и есть основная задача isFinite().

Когда это полезно

isFinite() удобно использовать, когда:

  • нужно быстро понять, можно ли получить из значения обычное число
  • не страшно неявное приведение типов
  • вы осознанно проверяете результат преобразования

Пример:

if (!isFinite(userInput)) {
  console.log("Введите корректное число");
}

Для грубой проверки ввода такой вариант иногда подходит.

Когда лучше Number.isFinite()

Если вам нужна строгая проверка уже готового числа, обычно лучше:

const value = Number(userInput);

if (!Number.isFinite(value)) {
  console.log("Введите корректное число");
}

Так код получается понятнее и предсказуемее.

Частые ошибки

Думать, что isFinite() проверяет только числа

console.log(isFinite("10")); // true

Но строка "10" сама по себе не число. Просто она успешно приводится к числу.

Удивляться результату для null, пустой строки и true

console.log(isFinite(null)); // true
console.log(isFinite(""));   // true
console.log(isFinite(true)); // true

Это нормальное поведение для глобальной isFinite(), потому что здесь работает приведение типов.

Использовать isFinite() там, где нужна строгая проверка

console.log(isFinite("123"));        // true
console.log(Number.isFinite("123")); // false

Если важно проверить именно число, а не “что-то, что можно привести к числу”, чаще лучше Number.isFinite().

Быстрая памятка

  • isFinite() - это глобальная функция
  • она сначала приводит значение к числу
  • возвращает true, если результатом стало конечное число
  • строки, null, true и некоторые массивы могут дать true
  • для строгой проверки обычно удобнее Number.isFinite()

Коротко

isFinite() - это проверка не только для чисел, а для значений, которые можно превратить в конечное число. Главное, что стоит запомнить: из-за автоматического приведения типов в современном коде её обычно используют осторожно, а для точной проверки предпочитают Number.isFinite().