Js中的无穷数(Infinity)

更新日期: 2020-01-16阅读: 4.8k标签: 数字
作者: Dmitri Pavlutin
译者:前端小智
来源:dmitripavlutin


为了保证的可读性,本文采用意译而非直译。

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

当使用不同操作符操作数时,也可能会得到负无穷:

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。


链接: https://www.fly63.com/article/detial/7453

Js对数字类型的支持

由于 JavaScript 采用 IEEE 754 标准,数值存储为64位双精度格式,数值精度最多可以达到 53 个二进制位(1 个隐藏位与 52 个有效位)。如果数值的精度超过这个限度,第54位及后面的位就会被丢弃.

JS实现数字金额转大写金额

由于js的弱精度,在计算小数相加时总是会丢失精度,JS将金额数字转大写的方法封装,数字大写对照表;下面为大家整理些常用的实现方法。

JS判断值是否是数字

isNaN()的缺点就在于 null、空格以及空串会被按照0来处理;对于空数组和只有一个数值成员的数组,isNaN返回false。校验只要是数字(包含正负整数,0以及正负浮点数)就返回true

Js浮点型数字误差引发的问题

JavaScript 中浮点型精度的误差,是非常基础但是却又经常不被重视的问题。文中分享的方案,足以覆盖项目中的所有情况,但如果用在其它地方或项目中,在一些极端情况下可能会有问题。

vue限制文本框输入数字的正确姿势

最近遇到一个需求,需要限制文本框输入数字,而number类型的输入框有箭头,个人不是很喜欢,因此想要寻求其它途径实现。本想通过网上找个现成的插件,然而百度,谷歌一番都没有找到满意的答案,至于随手一搜出来的方案或多或少都有点缺陷。因此自己动手,丰衣足食。

JS数字精度

最近在看计算机组成原理的浮点数部分,突然想起之前看过的一道快手面试题,为什么JS中0.1+0.2不等于0.3,应该如何解决?这里我们可以借这道题来说一下JS的精度问题

Js将负数转换为正数?

这是一种通用方法,我们首先检查数字是已经是正数还是负数,如果数字是负数,那么我们将数字乘以-1以使其为正数。使用Math.abs()方法将负数转换为正数。

Js如何从字符串中提取数字?

如果想要将一个字符串中的数字给提取出来,这要怎么做? 在JavaScript中可以使用match()方法将字符串中的数字提取到数字数组中。此方法将正则表达式作为参数,并从字符串中提取数字。使用match()方法提取数字分两种情况:

javascript如何判断值是否是数字?

javascript如何判断一个值是否是数字?下面本篇文章就来给大家介绍一下使用javascript判断一个值是否是数字的方法,sNaN() 函数用于检查其参数是否是非数字值。如果 值x 是特殊的非数字值 NaN

javascript如何判断两个数是否整除?

JavaScript判断两个整数(a,b,a>b)的整除时,可以用Number.isInteger(a/b)或者a%b==0来进行判断,但是如果其中涉及到小数就会导致计算过程中精度丢失。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!