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() уже недостаточно.