Js中的⽆穷数(Infinity)
为了保证的可读性,本⽂采⽤意译⽽⾮直译。
Infinity(⽆穷⼤)在 js 中是⼀个特殊的数字,它的特性是:它⽐任何有限的数字都⼤,如果不知道 Infinity,我们在⼀些运算操作遇到时,就会觉得很有意思。
现在我们来看看 js 中的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
2. Infinity 的特性
Infinity⽐任何有限数都⼤。
举⼏个例⼦ Look Look:
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
javascript的特性当使⽤不同操作符操作数时,也可能会得到负⽆穷:
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 的的⼀些坑
我们很可能不会经常使⽤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
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
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()确定提供的参数是否是⼀个有限的数字。
在涉及数字⽐较的算法时,可以使⽤Infinite初始化变量,⽤例是寻数组的最⼩值。
解析来⾃输⼊的数字时,必须⼩⼼Infinity:Number('Infinity'),parseFloat('Infinity')返回实际的Infinity。当使⽤JSON.stringify()序列化
时,Infinity变为null。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论