Проверка чисел в JavaScript

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

let value = Number('JavaScript');

console.log(value);

Результат:

NaN

Если не проверить такое значение, дальше в вычислениях могут появиться странные результаты.

Зачем проверять числа

Обычно число проверяют перед расчетами или перед сохранением данных.

Например, нужно убедиться, что:

  • значение действительно является числом;
  • число не равно NaN;
  • число не равно Infinity или -Infinity;
  • число целое, если нужна штука, возраст, страница или количество.

Для разных проверок есть разные инструменты.

Проверка через typeof

Оператор typeof показывает тип значения.

console.log(typeof 25);
console.log(typeof '25');

Результат:

number
string

Можно проверить, что значение относится к типу number:

let value = 25;

if (typeof value === 'number') {
  console.log('Это число');
}

Но у такой проверки есть важный нюанс.

console.log(typeof NaN);
console.log(typeof Infinity);

Результат:

number
number

NaN и Infinity тоже имеют тип number. Поэтому typeof проверяет только тип, но не говорит, что перед нами обычное число для расчетов.

Number.isFinite()

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

console.log(Number.isFinite(25));
console.log(Number.isFinite(3.14));
console.log(Number.isFinite(NaN));
console.log(Number.isFinite(Infinity));

Результат:

true
true
false
false

Для большинства обычных расчетов это самая удобная проверка: значение должно быть числом, не NaN и не бесконечностью.

Метод не преобразует строки.

console.log(Number.isFinite('25'));

Результат:

false

Если значение пришло строкой, сначала его нужно явно преобразовать.

Number.isNaN()

Number.isNaN() проверяет, является ли значение именно NaN.

let value = Number('text');

console.log(Number.isNaN(value));

Результат:

true

Метод полезен после преобразования строки в число, когда нужно понять, получилось число или нет.

let first = Number('10');
let second = Number('hello');

console.log(Number.isNaN(first));
console.log(Number.isNaN(second));

Результат:

false
true

Для проверки обычного числа чаще удобнее Number.isFinite(), потому что он сразу отсекает и NaN, и Infinity.

Number.isInteger()

Number.isInteger() проверяет, является ли значение целым числом.

console.log(Number.isInteger(10));
console.log(Number.isInteger(10.5));

Результат:

true
false

Такая проверка нужна, когда дробные значения не подходят.

let count = 3.5;

if (Number.isInteger(count)) {
  console.log('Количество подходит');
} else {
  console.log('Нужно целое число');
}

Результат:

Нужно целое число

Строки метод тоже не преобразует.

console.log(Number.isInteger('10'));

Результат:

false

Проверка ввода пользователя

prompt() всегда возвращает строку. Поэтому сначала проверим пустой ввод, потом преобразуем значение в число, а уже после этого проверим результат.

let value = prompt('Введите цену');

if (value === '') {
  console.log('Введите значение');
} else {
  let price = Number(value);

  if (Number.isFinite(price)) {
    console.log(price * 2);
  } else {
    console.log('Введите число');
  }
}

Почему пустую строку проверяем отдельно? Потому что Number(”) возвращает 0.

console.log(Number(''));

Результат:

0

Если пустой ввод в вашей задаче не должен считаться нулем, его нужно обработать до преобразования.

Если нужно именно целое число, после преобразования можно использовать Number.isInteger().

let value = '5';
let count = Number(value);

console.log(Number.isInteger(count));

Результат:

true

Итого

Проверка чисел зависит от того, что именно нужно узнать.

  • typeof value === ‘number’ проверяет только тип значения.
  • Number.isFinite(value) проверяет обычное конечное число.
  • Number.isNaN(value) проверяет, является ли значение NaN.
  • Number.isInteger(value) проверяет целое число.
  • Если значение пришло строкой, сначала используйте Number(), а потом проверяйте результат.
  • Пустую строку лучше проверять отдельно, если она не должна превращаться в 0.