JavaScript数值溢出不报错但行为复杂:上溢得Infinity/-Infinity,下溢归零或渐进下溢(含-0),安全整数上限为2⁵³−1,类型化数组则按规则截断或夹紧。

JavaScript 中数值溢出与下溢不报错,但行为容易误判——它不“回绕”也不“截断”,而是依据 IEEE 754 浮点规则产生 Infinity、-Infinity 或 0(含 -0),同时存在精度丢失、渐进下溢、安全整数边界等隐性陷阱。
浮点上溢:超出 MAX_VALUE 后走向 Infinity
JavaScript 使用双精度浮点数(64 位),最大可表示正数为 Number.MAX_VALUE(约 1.798 × 10³⁰⁸)。超过该值并非一律变成最大值,而是取决于溢出幅度:
- 略超一点(如
Number.MAX_VALUE + 1e291)→ 仍四舍五入为Number.MAX_VALUE - 再大一点(如
Number.MAX_VALUE + 1e292或Number.MAX_VALUE * 2)→ 直接转为Infinity - 负数同理:小于
-Number.MAX_VALUE的结果为-Infinity
浮点下溢:趋近零时归零或进入渐进下溢区
最小正正规数是 Number.MIN_VALUE(约 5 × 10⁻³²⁴)。比它更小的正数不会报错,但分两种情况:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 除法类下溢(如
Number.MIN_VALUE / 10)→ 直接得0 - 极小值运算(如
5e-324)→ 进入“渐进下溢”:尾数前导零增多,精度逐步丢失,但仍非零(例如5e-324可表示为非零值,而1e-325会归零) - 负数下溢得
-0,它与0全等(===为 true),但在除法中表现不同(1 / -0 === -Infinity)
整数精度边界:Safe Integer 不等于最大整数
虽然 Number.MAX_VALUE 极大,但 JavaScript 整数运算真正“可靠”的上限是 Number.MAX_SAFE_INTEGER(2⁵³ − 1 = 9007199254740991):
立即学习“Java免费学习笔记(深入)”;
- 超过此值后,相邻整数无法被唯一表示(如
9007199254740992 === 9007199254740993返回 true) -
Number.isSafeInteger()可检测是否处于无精度风险范围 - 若需更大整数,应使用
BigInt(需加n后缀,且不能与普通数字混算)
类型化数组的溢出:明确截断,行为可控
与普通 number 不同,Int8Array、Uint8Array 等类型化数组对溢出有明确定义:
- 无符号数组(如
Uint8Array):上溢取低 8 位(256 → 0),下溢转为对应无符号值(-1 → 255) - 有符号数组(如
Int8Array):按二补码截断(128 → -128,255 → -1) - 夹板数组(
Uint8ClampedArray):强制“夹紧”——超 255 → 255,低于 0 → 0,适合图像像素处理等场景

















