为了保证更好的可读性javascript 输入数字,本文采用音译代替音译。
Infinity(无穷大)是JS中的一个特殊数字。 它的特点是比任何有限数都大。 如果我们不知道Infinity,当我们遇到一些操作时,我们会觉得它很有趣。
现在让我们看一下 JS 中的 Infinity 属性,了解用例并解决一些常见的陷阱。
1. 无穷大的定义
无穷大可以分为正无穷大和负无穷大两种。 JS中对应的表示方法有:+Infinity(或Infinity)和-Infinity。
这意味着 Infinity 和 -Infinity(小于任何有限数的数字)都是 number 类型的特殊值:
typeof Infinity; // => 'number'
typeof -Infinity; // => 'number'
无穷大是全局对象的一个属性:
window.Infinity; // => Infinity
复制
此外,Number函数还有两个属性来表示正无穷大和负无穷大:
Number.POSITIVE_INFINITY; // => Infinity
Number.NEGATIVE_INFINITY; // => -Infinity
复制
2.Infinity的特点
无穷大大于任何有限数。
举几个例子看看看看:
Infinity > 100; // => true
Infinity > Number.MAX_SAFE_INTEGER; // => true
Infinity > Number.MAX_VALUE; // => true
复制
当无穷大用作减法、乘法和加法等算术运算中的操作数时javascript 输入数字,会产生有趣的效果:
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 true
-Infinity true
-Infinity true
复制
此外,负无穷大于正无穷:
-Infinity true
复制
使用不同的运算符操作数时也可能得到负无穷大:
Infinity * -1; // => -Infinity
Infinity / -2; // => -Infinity
-2 / 0; // => -Infinity
复制
3. 判断是无限的
幸运的是,Infinity 等于同号的 Infinity:
Infinity === Infinity; // => true
-Infinity === -Infinity; // => true
复制
但上面的符号不同且不相等,所以很容易理解:
Infinity === -Infinity; // => false
复制
JSt 有一个特殊的函数 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() 迭代中,最小值成为第一项。
5. 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
复制
5.2 JSON序列化
JSON.stringify() 将无穷大数字序列化为 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 将该数字转换为无穷大:
2 * Number.MAX_VALUE; // => Infinity
Math.pow(10, 1000); // => Infinity
复制
5.4 数学函数
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代表无限数的概念。 任何有限数都大于无穷大,任何有限数都小于-无穷大。
在 JS 中比较无穷大值很容易:Infinity === Infinity 为 true。 特殊函数 Number.isFinite() 确定提供的参数是否是有限数。
当涉及数值比较的算法时,变量可以用Infinite初始化。 用例是找到链表的最小值。
解析输入中的数字时,必须注意无穷大:Number('Infinity')、parseFloat('Infinity') 返回实际的无穷大。 使用 JSON.stringify() 序列化时,无穷大变为 null。
原来的:
代码部署后可能存在的Bug无法实时得知。 事后为了解决此类bug,花费了大量的时间在日志调试上。 顺便推荐一个好用的bug监控工具Fundebug。
发表评论