Number.isSafeInteger()用于判断值是否为安全整数,即满足:是number类型、为整数、且在[−2⁵³+1, 2⁵³−1]范围内;不进行类型转换,字符串等非number类型直接返回false。

Number.isSafeInteger() 用来判断一个值是否为“安全整数”——即该整数能被精确表示,且不会因浮点精度问题导致意外变化。它不直接告诉你“是否超出安全范围”,而是返回 true 或 false,帮你做这个判断。
什么是安全整数?
JavaScript 中所有数字都用 IEEE 754 双精度浮点数表示,能**精确表示的整数范围是 −2⁵³+1 到 2⁵³−1**(即 −9,007,199,254,740,991 到 9,007,199,254,740,991)。超出这个范围的整数可能丢失精度(比如 9007199254740992 + 1 === 9007199254740992)。
Number.isSafeInteger() 就是检查一个值是否满足两个条件:
- 是
number类型 - 是整数,且在 [−2⁵³+1, 2⁵³−1] 范围内
怎么用 Number.isSafeInteger() 做判断?
直接传入待测值,它会返回布尔结果:
立即学习“Java免费学习笔记(深入)”;
-
Number.isSafeInteger(9007199254740991)→true(刚好是上限) -
Number.isSafeInteger(9007199254740992)→false(超出上限,不安全) -
Number.isSafeInteger(-9007199254740991)→true(下限) -
Number.isSafeInteger(-9007199254740992)→false -
Number.isSafeInteger(3.14)→false(不是整数) -
Number.isSafeInteger("123")→false(不是 number 类型)
常见误用和注意事项
这个方法**不做类型转换**,所以字符串、null、undefined、布尔值都会直接返回 false:
- 想检测字符串数字?先用
Number()或一元加号转成数字,再判断:Number.isSafeInteger(+str)或Number.isSafeInteger(Number(str)) - 注意
Number.isSafeInteger(NaN)、Number.isSafeInteger(Infinity)都返回false - 它和
Number.isInteger()不同:后者只判断是否为整数,不管是否安全
配合使用场景举例
比如处理用户输入的 ID、计数器、数组索引等需要精确整数的场景:
- 接收 API 返回的 ID 字段时:
if (!Number.isSafeInteger(id)) { throw new Error('ID 超出安全整数范围,可能精度丢失'); } - 做大数运算前快速兜底:
if (Number.isSafeInteger(a) && Number.isSafeInteger(b)) { return a + b; } else { /* 用 BigInt 或其他方案 */ }


















