JavaScript 中的无穷数(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; // => 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; // => 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 的的一些坑
我们很可能不会经常使用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。
原文:
上一篇: React中Ref 的使用方法详解
下一篇: 常见硬件术语大全(六)