javascript无整数溢出异常,而是静默产生infinity、-infinity或nan;需用!isfinite()检测非有限值,对高风险运算前置校验,金融等场景应转整数运算并封装容错函数,循环计算须监控单调性与耗时。

JavaScript 中没有真正的“整数溢出异常”,它不会像 Java 或 C 那样抛出 ArithmeticException,而是静默产生 Infinity、-Infinity 或 NaN,浮点精度丢失(如 0.1 + 0.2 === 0.30000000000000004)也常被误认为“溢出”,但本质是 IEEE-754 双精度表示限制。因此 JS 的“溢出监控”核心是:主动识别危险值、拦截非法运算、在关键路径做前置校验。
识别 Infinity 和 NaN 的即时检测
这是最基础也最可靠的溢出信号。所有算术结果都应优先检查是否落入非有限数范围:
- 用
!isFinite(value)一次性捕获Infinity、-Infinity、NaN - 避免直接比较
value === Infinity,因为-Infinity会被漏掉 - 对除法、幂运算、大数累乘等高风险操作,必须在赋值后立即校验:
const result = Math.pow(10, 309); if (!isFinite(result)) throw new Error("数值超出安全范围");
防范浮点精度误差的业务级容错
精度问题虽非严格意义的溢出,但在金融、计费、坐标计算等场景后果等同于溢出。不能依赖 toFixed() 临时修复,而要建立统一处理层:
- 涉及小数运算前,统一转为整数运算(例如金额全部以“分”为单位)
- 封装安全加减乘除函数,内部使用
Number.EPSILON做误差容忍判断:
function safeAdd(a, b) { const sum = a + b; return Math.abs(sum - (a + b)) - 对用户输入或外部 API 返回的数字,用
Number.isSafeInteger()判断是否在±2^53−1范围内,超限则拒绝或降级处理
大数运算的主动降级与替代方案
当业务明确需要处理超安全整数范围的值(如区块链地址、大ID、密码学运算),不应硬扛原生 number 类型:
- 轻量场景用
BigInt(注意:不能和 number 混用,需显式转换,且不支持小数) - 复杂计算(含小数、高精度、四则+开方+三角)引入
decimal.js或big.js,它们提供.add()、.mul()等方法并内置溢出策略(如toPrecision()截断或抛错) - 服务端关键路径建议将大数计算下沉,前端只做展示和简单校验,规避 JS 运行时不可控因素
递归与深度计算中的数值熔断
数值本身未溢出,但递归中中间值失控或调用栈过深,也会导致崩溃——这属于“隐性溢出”:
- 在递归函数入口增加深度限制参数,并校验每次生成的新值是否仍在合理业务区间(例如阶乘递归中,若当前参数 > 170 就提前终止,因
Math.exp(170)已接近Infinity) - 对每轮计算结果做单调性/收敛性判断:若连续若干次结果绝对值翻倍增长,或趋近
Infinity,强制中断并告警 - 结合
performance.now()监控单次计算耗时,超阈值即视为潜在失控,避免无限循环拖垮页面











