JavaScript 中的无穷数(Infinity)详解
为了保证的可读性,本文采用意译而非直译。
Infinity(无穷大)在JS中是一个特殊的数字,它的特性是:它比任何有限的数字都大,如果不知道Infinity,我们在一些运算操作遇到时,就会觉得很有意思。
现在我们来看看JS中的Infinity属性,了解用例并解决一些常见的陷阱。
1.Infinity(无穷)的定义
无穷可以分为两种,正无穷和负无穷,JS中对应的表示方式为:+Infinity(或者Infinity)和-Infinity。
这意味着Infinity和-Infinity(小于任何有限数的数字)都是number类型的特殊值:
typeofInfinity;//=>'number' typeof-Infinity;//=>'number'
Infinity是全局对象的属性:
window.Infinity;//=>Infinity
另外,Number函数也有两个属性来表示正负无穷大:
Number.POSITIVE_INFINITY;//=>Infinity
Number.NEGATIVE_INFINITY;//=>-Infinity
2.Infinity的特性
Infinity比任何有限数都大。
举几个例子LookLook:
Infinity>100; //=>true
Infinity>Number.MAX_SAFE_INTEGER;//=>true
Infinity>Number.MAX_VALUE; //=>true
Infinity在加法、乘法和除法等算术运算中用作操作数时会产生有趣的效果:
Infinity+1; //=>Infinity
Infinity+Infinity;//=>InfinityInfinity*2; //=>Infinity
Infinity*Infinity;//=>InfinityInfinity/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*-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.无穷的的使用情况
当我们需要初始化涉及数字比较的计算时,无穷值就非常方便。例如,在数组中搜索最小值时:
functionfindMin(array){
letmin=Infinity;
for(constitemofarray){
min=Math.min(min,item);
}
returnmin;
}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.2JSON序列化
JSON.stringify()将Infinity数字序列化为null。
constworker={
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.4Math函数
JS中Math命名空间的某些函数可以返回Infinity:
constnumbers=[1,2]; constempty=[]; 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。
原文:https://dmitripavlutin.com/infinity-in-javascript/
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。