Number.isSafeInteger用于判断数值是否为安全整数(±9007199254740991内可精确表示),专用于ID、金额等大数精度兜底,非通用整数校验,对非数字类型一律返回false。
Number.isSafeInteger 主要用于判断一个数值是否为“安全整数”,即在 JavaScript 的 IEEE 754 双精度浮点数表示范围内,能被**精确表示且不丢失精度**的整数(范围是 -(2<sup>53</sup> - 1) 到 2<sup>53</sup> - 1,即 ±9007199254740991)。它不是通用的“是否为整数”校验工具,而是一个**精度保障型检查**,在业务中真正有用的地方,往往出现在对 ID、计数、金额、序列号等关键数值做可靠性兜底时。
很多系统使用 64 位整数 ID(如 Snowflake、数据库自增 bigint),但 JSON 本身不区分 int/float,JavaScript 会将其转为 Number 类型。一旦 ID 超出 2<sup>53</sup> - 1,就可能被四舍五入,导致 ID 失真(例如 9007199254740992 和 9007199254740993 在 JS 中相等)。这时用 Number.isSafeInteger(id) 可快速识别风险:
false,说明该 ID 在 JS 中无法精确表达,应改用字符串传输并处理(如后端返回 "id": "9007199254740992")if (!Number.isSafeInteger(id)) console.warn('ID 精度可能丢失')
Number.isSafeInteger("123") 直接返回 false,无需额外 typeof 判断当业务涉及金额累计、库存计数、分页总数等可能增长到极大值的场景,运算结果若超出安全整数范围,后续比较或存储就会出错。例如:
2<sup>53</sup>,再加 1 可能无变化total: 9007199254740992,前端计算总页数 Math.ceil(total / pageSize) 会得到错误结果if (!Number.isSafeInteger(newTotal)) throw new Error('累计值溢出,需切换为 BigInt 或字符串处理')
很多人误以为 Number.isSafeInteger 可替代类型校验,但它对非数字输入一律返回 false,且不处理字符串转换。常见误区:
立即学习“Java免费学习笔记(深入)”;
Number.isSafeInteger("123") → false(不是数字类型)Number.isSafeInteger(123.0) → true(.0 不影响,仍是整数且安全)Number.isSafeInteger(123.5) → false(不是整数)Number(val) 转换,再用 isSafeInteger,但要注意 Number("abc") 是 NaN,而 Number.isSafeInteger(NaN) 也是 false
用户输入的年龄、数量等小范围整数,用 Number.isInteger 或正则 /^-?d+$/ 更合适。isSafeInteger 在这里属于“过度防护”: