Number.isSafeInteger() 是判断参数是否为安全整数的静态方法,返回布尔值;安全整数指在 ±(2⁵³−1) 范围内、可被 IEEE-754 精确表示且无舍入歧义的整数。

Number.isSafeInteger() 是 JavaScript 中专门用来判断一个数值是否为“安全整数”的内置方法。它返回布尔值:true 表示是安全整数,false 表示不是。
什么是安全整数?
安全整数是指能够被精确表示、且其前一个和后一个整数也能被精确表示的整数。JavaScript 使用 IEEE 754 双精度浮点数存储数字,能精确表示的整数范围是:
- 从
-(2^53 - 1)到2^53 - 1 - 也就是
-9007199254740991到9007199254740991
超出这个范围的整数可能出现精度丢失(例如 9007199254740992 === 9007199254740993 会返回 true),因此不“安全”。
Number.isSafeInteger() 的行为特点
该方法只对**确实是整数**且落在安全范围内才返回 true。它会严格检查两个条件:
- 参数必须是
number类型(非NaN、非Infinity、非字符串等) - 该数值必须是整数(
Number.isInteger()也需为true) - 该整数的绝对值 ≤
2^53 - 1
例如:
Number.isSafeInteger(9007199254740991) // true
Number.isSafeInteger(9007199254740992) // false(超出上限)
Number.isSafeInteger(-9007199254740991) // true
Number.isSafeInteger(-9007199254740992) // false(低于下限)
Number.isSafeInteger(3.14) // false(不是整数)
Number.isSafeInteger(NaN) // false(不是数字)
Number.isSafeInteger('123') // false(不是 number 类型)
Number.isSafeInteger(Infinity) // false
常见误用与注意事项
不要把它当作通用的“是否为整数”检测 —— 它比 Number.isInteger() 更严格:
-
Number.isInteger(1e21)返回true(数学上是整数),但Number.isSafeInteger(1e21)是false(因为1e21超出安全范围,实际已无法精确表示) - 它不会进行类型转换,传入字符串、布尔值、
null等一律返回false - 对于大整数运算(如 ID 处理、密码学相关),务必用此方法校验,避免因精度问题引发逻辑错误
替代方案(兼容旧环境)
如果需要支持不带 Number.isSafeInteger 的老浏览器(如 IE),可手动实现:
function isSafeInteger(n) {
return Number.isInteger(n) && Math.abs(n) <= 9007199254740991;
}
注意:仍需确保 Number.isInteger 存在或一并 polyfill,否则需进一步补全整数判断逻辑。


















