Infinity 是 JavaScript 中表示正无穷大的合法数值,-Infinity 表示负无穷大;常见于非零数除以 0、超范围运算、Math 函数返回及显式赋值;需用 Number.isFinite() 等方式准确识别;易导致 UI 异常、计算崩溃等问题,应通过校验分母、过滤无穷值、封装安全函数等方式防御。

JavaScript 中的 Infinity 是一个特殊的数值,表示正无穷大;对应地还有 -Infinity 表示负无穷大。它不是错误,而是合法的 Number 类型值,但容易在计算中引发意外行为。理解它怎么来、怎么识别、怎么处理,对写健壮代码很关键。
哪些操作会生成 Infinity
以下常见场景会直接产出 Infinity 或 -Infinity:
- 非零数除以 0:
5 / 0→ Infinity;-5 / 0→ -Infinity - 超出浮点数最大安全范围的运算:
Number.MAX_VALUE * 2→ Infinity - Math 函数返回无穷:如
Math.log(0)→ -Infinity,Math.exp(1000)→ Infinity - 显式赋值:
let x = Infinity;或let y = 1/0;
如何准确判断一个值是不是 Infinity
不能只靠 === 或 ==,因为 Infinity !== Infinity 在某些旧环境有陷阱(虽然现代标准下是 true),更稳妥的方式是用内置方法:
-
isFinite(x):返回 false 当x是 Infinity、-Infinity 或 NaN -
Number.isFinite(x):更严格,只对有限数字返回 true,不尝试类型转换(推荐) -
x === Infinity或x === -Infinity:在确定是 number 类型时可用,但需先排除NaN -
typeof x === 'number' && !isFinite(x):组合判断,可区分 Infinity 和 NaN
Infinity 在实际逻辑中容易出问题的地方
它常悄无声息地破坏比较、聚合或渲染逻辑:
立即学习“Java免费学习笔记(深入)”;
- 数组求最大值:
Math.max(...[1, 2, Infinity])→ Infinity,可能让后续 UI 显示异常或接口校验失败 - 时间差计算误得负无穷:
new Date().getTime() - null→ NaN,但若误写成/ 0就得 Infinity - 前端分页计算:
Math.ceil(total / pageSize),当pageSize为 0 时结果是 Infinity,导致页码渲染崩溃 - 图表库传入无穷坐标:很多可视化库不处理 Infinity,直接报错或白屏
实用的防御性处理方案
在关键数值路径上加一层“消毒”即可大幅降低风险:
- 除法前校验分母:
const result = divisor === 0 ? 0 : dividend / divisor; - 聚合前过滤无穷值:
arr.filter(Number.isFinite).reduce((a, b) => a + b, 0) - 封装安全除法函数:function safeDiv(a, b) { return b === 0 ? 0 : a / b; }
- 后端返回数值字段时,前端解析后主动清理:
if (!Number.isFinite(val)) val = null;或默认值










