Infinity(无穷)在 JS 中是一个特殊的数字, 它的特性是: 它比任何有限的数字都大, 如果不知道 Infinity, 我们在一些运算操作遇到时, 就会觉得很有意思.
现在我们来看看 JS 中的 Infinity 属性, 了解用例并解决一些常见的陷阱.
1.Infinity(无穷)的定义
ECMAScript 标准对 Infinity 的描述如下:
There are two other special values, called positive Infinity and negative Infinity. [...] Note that these two infinite Number values are produced by the program expressions +Infinity (or simply Infinity) and -Infinity.
无穷可以分为两种: 正无穷大和负无穷大. 这两个无穷大的数值在 JS 中对应的表示方式为:+Infinity(或简单地说 Infinity) 和 -Infinity.
这意味着 Infinity 和 - Infinity(比任何有限数都小的数)都是 number 类型的特殊值:
- typeof Infinity; // => 'number'
- typeof -Infinity; // => 'number'
Infinity 是全局对象的属性, 例如在浏览器中:
Windows.Infinity; // => Infinity
注意, Number 函数具有两个属性来表示正负无穷:
- Number.POSITIVE_INFINITY; // => Infinity
- Number.NEGATIVE_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
负无穷
-Infinity (负无穷大)小于任何有限数.
让我们将 - 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 等于相同符号的 Infinity:
- Infinity === Infinity; // => true
- -Infinity === -Infinity; // => true
但前面的符号不一样就不相等, Infinity 不等于 - Infinity:
Infinity === -Infinity; // => false
JavaScript 有一个特殊的函数 Number.isFinite(value), 可以用于检查提供的值是否有限数:
- Number.isFinite(Infinity); // => false
- Number.isFinite(-Infinity); // => false
- Number.isFinite(999); // => true
4. Infinity 的使用情况
当我们需要初始化涉及数字比较的计算时, 无穷值就非常方便.
例如, 在数组中搜索最小值时:
- 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()迭代中, 最小值就成为第一项.
5. Infinity 的一些坑
我们很可能不会经常使用 Infinity 值. 但是, 值得知道何时会出现 Infinity 值.
解析数据
假设 JavaScript 使用一个输入 (POST 请求, 输入字段的值等) 来解析一个数字. 在简单的情况下, 它会工作得很好:
- // Parses the float number
- parseFloat('10.5'); // => 10.5
- // Indicates an invalid number
- parseFloat('ZZZ'); // => NaN
这里必须小心, 因为 parseFloat()可以将'Infinity'字符串解析为实际的 Infinity 数:
parseFloat('Infinity'); // => Infinity
另一个是使用 parseInt()来解析整数, 它无法将'Infinity'识别为整数:
- parseInt('10', 10); // => 10
- parseInt('Infinity', 10); // => NaN
JSON 序列化
JSON.stringify()将 Infinity 数字序列化为 null.
- const worker = {
- salary: Infinity
- };
- JSON.stringify(worker); // => '{"salary": null }'
salary 属性值为 Infinity 但是当字符串化为 JSON 时,"salary" 值将变为 null.
最大数溢出
Number.MAX_VALUE 是 JavaScript 中最大的浮点数.
为了使用甚至大于 Number.MAX_VALUE 的数字, JS 将该数字转换为 Infinity:
- 2 * Number.MAX_VALUE; // => Infinity
- Math.pow(10, 1000); // => Infinity
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. 如果尝试确定一个空数组的最大值或最小值, 那结果后面人感到意外.
总结
JavaScript 中的 Infinity 表示无穷数的概念. 任何有限数均小于 Infinity, 而任何有限数均大于 - Infinity.
比较 JavaScript 中的无穷值: Infinity === Infinity 为 true. 特殊的函数 Number.isFinite()确定提供的参数是否是一个有限的数字.
Infinite 在涉及数字比较的算法时, 可以使用 Infinite 初始化变量, 一个用例是寻找数组的最小值.
解析来自输入的数字时, 必须注意 Infinity:Number('Infinity'),parseFloat('Infinity')返回实际的 Infinity. 当使用 JSON.stringify()序列化时, 这个 Infinity 变为 null.
来源: http://www.css88.com/web/javascript/15203.html