Learn JavaScript

Number.isSafeInteger() - метод для проверки безопасного целого числа в JavaScript

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

Это значит, что число должно быть:

  • целым
  • конечным
  • находиться в диапазоне, где JavaScript хранит его без потери точности

Синтаксис

Number.isSafeInteger(value)

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

Что делает Number.isSafeInteger()

Метод отвечает на более строгий вопрос, чем Number.isInteger(): это не просто целое число, а целое число, с которым JavaScript может работать точно.

console.log(Number.isSafeInteger(10));   // true
console.log(Number.isSafeInteger(3.14)); // false
console.log(Number.isSafeInteger(NaN));  // false

Это важно, когда вы работаете с большими числами, идентификаторами или счётчиками.

Что возвращает Number.isSafeInteger()

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

  • true, если это безопасное целое число
  • false, если это дробное число, слишком большое число, NaN, Infinity или другой тип
console.log(Number.isSafeInteger(0));                // true
console.log(Number.isSafeInteger(9007199254740991)); // true
console.log(Number.isSafeInteger(9007199254740992)); // false

Что значит “безопасное”

В JavaScript числа типа number хранятся не как произвольные целые, а как числа с плавающей точкой.

Из-за этого точность гарантируется только в диапазоне:

console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991

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

Number.isSafeInteger() и Number.isInteger()

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

console.log(Number.isInteger(9007199254740992));     // true
console.log(Number.isSafeInteger(9007199254740992)); // false
  • Number.isInteger() проверяет только целое ли число
  • Number.isSafeInteger() дополнительно проверяет диапазон безопасной точности

То есть каждое безопасное целое число является целым, но не каждое целое число безопасно.

Без неявного приведения типов

Как и другие методы Number.*, этот метод ничего не преобразует автоматически.

console.log(Number.isSafeInteger("10")); // false
console.log(Number.isSafeInteger(null)); // false
console.log(Number.isSafeInteger(true)); // false

Если значение приходит строкой, сначала его обычно превращают в число:

const value = Number("10");

console.log(Number.isSafeInteger(value)); // true

Почему это важно

При работе с очень большими числами можно получить неожиданное поведение из-за потери точности.

const value = 9007199254740992;

console.log(Number.isSafeInteger(value)); // false

В таких ситуациях лучше не полагаться на обычный number, если нужна точность.

Number.isSafeInteger() и typeof

Проверка через typeof не решает ту же задачу.

const value = 9007199254740992;

console.log(typeof value);                // "number"
console.log(Number.isSafeInteger(value)); // false

typeof показывает только тип, но не говорит, безопасно ли хранится число.

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

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

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

Пример:

const id = Number(userInput);

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

После Number()

Метод часто используют после явного преобразования:

const value = Number("42");

console.log(Number.isSafeInteger(value)); // true

А здесь результат уже будет отрицательным:

const value = Number("3.14");

console.log(Number.isSafeInteger(value)); // false

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

Путать безопасное целое число и просто целое число

console.log(Number.isInteger(9007199254740992));     // true
console.log(Number.isSafeInteger(9007199254740992)); // false

Это самая частая путаница при работе с большими числами.

Проверять строку вместо числа

console.log(Number.isSafeInteger("15")); // false

Если значение строковое, сначала его обычно преобразуют:

const value = Number("15");

console.log(Number.isSafeInteger(value)); // true

Думать, что достаточно typeof

const value = 9007199254740992;

console.log(typeof value === "number");   // true
console.log(Number.isSafeInteger(value)); // false

Проверка типа не защищает от проблем с точностью.

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

  • Number.isSafeInteger() проверяет безопасное целое число
  • метод возвращает true или false
  • он строже, чем Number.isInteger()
  • диапазон безопасных целых чисел идёт от Number.MIN_SAFE_INTEGER до Number.MAX_SAFE_INTEGER
  • строки и другие типы дают false

Коротко

Number.isSafeInteger() - это способ проверить, что число в JavaScript не только целое, но и хранится без потери точности. Главное, что стоит запомнить: для больших значений одного Number.isInteger() уже недостаточно.