在 JavaScript 中,Number 类型在数值溢出时并不会触发错误提示,而是静默地返回 Infinity 或 -Infinity。这一行为源自 IEEE 754 标准定义的静默处理机制——系统直接给出“无穷大”信号,而非中断程序运行。不过,这种看似便利的静默方式在某些场景下会导致意料之外的逻辑缺陷。

溢出(Overflow):超出最大可表示数值范围
当计算结果超出 Number.MAX_VALUE(约 1.7976931348623157e+308)时,结果会被直接赋值为 Infinity;若为负方向超出,则得到 -Infinity。以下是几个典型示例:
Number.MAX_VALUE * 2→Infinity-Number.MAX_VALUE * 2→-Infinity1 / 0→Infinity;-1 / 0→-Infinity- 任何非零有限数与
Infinity进行常规算术运算(加、减、乘、除),结果依然为Infinity(符号按规则保留) - 但部分运算会得到
NaN,例如Infinity / Infinity、Infinity - Infinity
下溢(Underflow):数值趋近于零但低于最小可表示正数
若正数运算结果小于 Number.MIN_VALUE(约 5e-324),JavaScript 会将其“降级”为 0;负数同理,变为 -0。以下例子可以清晰说明:
Number.MIN_VALUE / 2→0-Number.MIN_VALUE / 2→-0- 值得留意的是,
0与-0在使用===比较时返回相等,但在除法运算中表现截然不同:1 / 0 === Infinity,而1 / -0 === -Infinity
安全整数边界:精度丢失而非溢出
这里需要特别区分“溢出”与“精度丢失”这两个概念。JavaScript 的 最大安全整数 为 Number.MAX_SAFE_INTEGER(2^53 - 1 = 9007199254740991)。超出此范围的整数虽然仍可存储,但无法保证精确表示:
9007199254740991 + 1→9007199254740992(此例恰好正确)9007199254740991 + 2→9007199254740992(精度丢失,+2 实际变成了 +1)
由此可见,问题并非返回 Infinity,而是浮点表示本身的局限性导致的隐式舍入——这一细节常被误解。
如何检测与应对
好在 JavaScript 内置了多个函数用于识别极端值,无需完全依赖人工排查:
isFinite(x):只有当x为普通数字(既不是NaN,也不是±Infinity)时返回trueisNaN(x):判断值是否为NaN。但需注意,isNaN("abc")会先将参数转为数字,易产生误判;推荐使用Number.isNaN(x),更为严格- 当涉及大整数运算时,最好避免直接使用
Number,改用BigInt(字面量加n后缀)或借助big.js等第三方库,更加稳妥
