JavaScript 无穷数 Infinity 详解:特性、运算与常见陷阱

作者:纸飞机时间:2026-10-24 03:47:21浏览:171

本文深入解析 JavaScript 中的 Infinity(无穷大)与 -Infinity。涵盖其定义、算术运算特性、判断方法,并重点剖析解析数据、JSON 序列化及最大数溢出等常见陷阱,帮助开发者正确处理边界数值。

为确保阅读体验,本文采用意译方式呈现核心内容。

在 JavaScript 中,Infinity(无穷大)是一个特殊的数值类型。其核心特征是大于任何有限数字。理解这一概念,有助于我们正确解读某些运算结果。

接下来将介绍 JS 中 Infinity 属性的具体用法,并通过实例解析常见的使用误区。

Infinity(无穷)的定义

1. Infinity(无穷)的定义

无穷数分为正无穷和负无穷两类。在 JS 中,分别用 +Infinity(或简写为 Infinity)和 -Infinity 表示。

这表明 Infinity 和 -Infinity 均属于 number 类型的特殊值。


typeof Infinity; // => 'number'
typeof -Infinity; // => 'number'

Infinity 是全局对象的属性:

window.Infinity; // => Infinity

此外,Number 构造函数也提供了两个属性来分别表示正负无穷大:

Number.POSITIVE_INFINITY; // => Infinity Number.NEGATIVE_INFINITY; // => -Infinity

Infinity 的特性

2. Infinity 的特性

Infinity 的值大于任何有限的数字。

通过以下示例验证:

Infinity > 100; // => true Infinity > Number.MAX_SAFE_INTEGER; // => true Infinity > Number.MAX_VALUE; // => true

当 Infinity 作为操作数参与加法、乘法或除法等算术运算时,会产生特定的结果:

Infinity + 1; // => Infinity Infinity + Infinity; // => Infinity

Infinity * 2; // => Infinity Infinity * Infinity; // => Infinity

Infinity / 2; // => Infinity

部分涉及 Infinity 的运算会返回有限数值:

10 / Infinity; // => 0

有限数字除以 0 会得到 Infinity 结果:

2 / 0; // => Infinity

对无穷数执行逻辑上不成立的运算,结果将是 NaN。例如,无法将无限数除以自身,也无法判断其奇偶性:

Infinity / Infinity; // => NaN Infinity % 2; // => NaN

负无穷

2.1 负无穷

负无穷小于任何有限数字。

将 -Infinity 与有限数字进行比较:

-Infinity < 100; // => true -Infinity < -Number.MAX_SAFE_INTEGER; // => true -Infinity < -Number.MAX_VALUE; // => true

同时,负无穷小于正无穷:

-Infinity < Infinity; // => true

使用不同的操作符处理操作数时,也可能得到负无穷:

Infinity * -1; // => -Infinity Infinity / -2; // => -Infinity -2 / 0; // => -Infinity

判断无穷

3.判断无穷

幸运的是,相同符号的 Infinity 相互比较会返回 true:

Infinity === Infinity; // => true -Infinity === -Infinity; // => true

符号不同时则不相等,这符合直观理解:

Infinity === -Infinity; // => false

JS 提供了一个特殊函数 Number.isFinite(value),用于检查给定值是否为有限数:

Number.isFinite(Infinity); // => false Number.isFinite(-Infinity); // => false Number.isFinite(999); // => true

无穷的使用情况

4. 无穷的使用情况 在涉及数值比较的算法中,无穷值非常有用。例如,在数组中寻找最小值时:

function findMin(array) { let min = Infinity; for (const item of array) { min = Math.min(min, item); } return min; }

findMin([5, 2, 1, 4]); // => 1

min 变量初始化为 Infinity。在第一次 for 循环迭代中,最小值被更新为数组的第一项。

Infinity 的一些坑

5. Infinity 的一些坑

虽然日常开发中不常直接使用 Infinity 值,但了解其出现场景至关重要。

解析数据

5.1. 解析数据

假设 JS 解析来自输入(如 POST 请求、输入字段值等)的数字。在简单情况下,它能正常工作:

parseFloat('10.5'); // => 10.5

parseFloat('ZZZ'); // => NaN

这里需要特别注意,parseFloat() 会将字符串 'Infinity' 解析为实际的 Infinity 数值:

parseFloat('Infinity'); // => Infinity

另一个例子是使用 parseInt() 解析整数,它无法将 'Infinity' 识别为有效整数:

parseInt('10', 10); // => 10

parseInt('Infinity', 10); // => NaN

JSON 序列化

5.2 JSON 序列化

JSON.stringify() 会将 Infinity 数字序列化为 null。

const worker = { salary: Infinity };

JSON.stringify(worker); // => '{ "salary": null }'

虽然 salary 属性值为 Infinity,但在转换为 JSON 字符串时,"salary" 的值变为 null。

最大数溢出

5.3 最大数溢出

Number.MAX_VALUE 是 JS 中最大的浮点数。

为了表示大于 Number.MAX_VALUE 的数字,JS 会将其转换为 Infinity:

2 * Number.MAX_VALUE; // => Infinity Math.pow(10, 1000); // => Infinity

Math 函数

5.4 Math 函数

JS 中 Math 命名空间下的某些函数会返回 Infinity:


const numbers = [1, 2];
const empty = [];

Math.max(...numbers); // => 2
Math.max(...empty);  // => -Infinity

Math.min(...numbers); // => 1
Math.min(...empty);  // => Infinity

在不带参数的情况下调用 Math.max() 时,返回 -Infinity;而 Math.min() 则返回 Infinity。如果尝试确定一个空数组的最大值或最小值,结果可能会出乎意料。

总结

JS 中的 Infinity 表示无穷数的概念。任何有限数均小于 Infinity,而任何有限数均大于 -Infinity。

比较 JS 中的无穷值很简单:Infinity === Infinity 为 true。使用特殊函数 Number.isFinite() 可确定参数是否为有限数字。

在涉及数值比较的算法中,可以使用 Infinity 初始化变量,典型用例是寻找数组的最小值。

解析来自输入的数字时需小心:Number('Infinity') 和 parseFloat('Infinity') 会返回实际的 Infinity。当使用 JSON.stringify() 序列化时,Infinity 会变为 null。

原文:https://dmitripavlutin.com/infinity-in-javascript/

作者最新文章