前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript 中的无穷数(Infinity)

JavaScript 中的无穷数(Infinity)

作者头像
前端小智@大迁世界
发布2020-05-12 14:38:04
7.4K0
发布2020-05-12 14:38:04
举报
文章被收录于专栏:终身学习者终身学习者

作者: Dmitri Pavlutin 译者:前端小智 来源:dmitripavlutin


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

Infinity(无穷大)在 JS 中是一个特殊的数字,它的特性是:它比任何有限的数字都大,如果不知道 Infinity, 我们在一些运算操作遇到时,就会觉得很有意思。

现在我们来看看 JS 中的Infinity 属性,了解用例并解决一些常见的陷阱。

1.Infinity(无穷)的定义

无穷可以分为两种,正无穷和负无穷,JS 中对应的表示方式为:+Infinity(或者Infinity) 和 -Infinity

这意味着Infinity-Infinity(小于任何有限数的数字)都是number类型的特殊值:

代码语言:javascript
复制
typeof Infinity;  // => 'number'
typeof -Infinity; // => 'number'

Infinity 是全局对象的属性:

代码语言:javascript
复制
window.Infinity; // => Infinity

另外,Number函数也有两个属性来表示正负无穷大:

代码语言:javascript
复制
Number.POSITIVE_INFINITY; // => Infinity
Number.NEGATIVE_INFINITY; // => -Infinity

2. Infinity 的特性

Infinity比任何有限数都大。

举几个例子 Look Look:

代码语言:javascript
复制
Infinity > 100;                     // => true
Infinity > Number.MAX_SAFE_INTEGER; // => true
Infinity > Number.MAX_VALUE;        // => true

Infinity 在加法、乘法和除法等算术运算中用作操作数时会产生有趣的效果:

代码语言:javascript
复制
Infinity + 1;        // => Infinity
Infinity + Infinity; // => Infinity

Infinity * 2;        // => Infinity
Infinity * Infinity; // => Infinity

Infinity / 2;        // => Infinity

一些Infinity 的运算得到有限的数:

代码语言:javascript
复制
10 / Infinity; // => 0

一个有限的数除以0得到 Infinity 结果:

代码语言:javascript
复制
2 / 0; // => Infinity

对无穷数进行概念上不正确的运算会得到NaN。 例如,不能除以无限数,也无法确定无限数是奇数还是偶数:

代码语言:javascript
复制
Infinity / Infinity; // => NaN
Infinity % 2;        // => NaN
2.1 负无穷

负无穷小于任何有限数

-Infinity 与一些有限数字进行比较:

代码语言:javascript
复制
-Infinity < 100;                      // => true
-Infinity < -Number.MAX_SAFE_INTEGER; // => true
-Infinity < -Number.MAX_VALUE;        // => true

同时,负无穷小于正无穷:

代码语言:javascript
复制
-Infinity < Infinity; // => true

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

代码语言:javascript
复制
Infinity * -1; // => -Infinity
Infinity / -2; // => -Infinity
-2 / 0;        // => -Infinity

3.判断无穷

幸运的是,Infinity等于相同符号的Infinity

代码语言:javascript
复制
Infinity === Infinity; // => true
-Infinity === -Infinity; // => true

但前面的符号不一样就不相等,就也很好理解:

代码语言:javascript
复制
Infinity === -Infinity; // => false

JSt有一个特殊的函数Number.isFinite(value),用于检查提供的值是否有限数:

代码语言:javascript
复制
Number.isFinite(Infinity);  // => false
Number.isFinite(-Infinity); // => false
Number.isFinite(999);       // => true

4. 无穷的的使用情况

当我们需要初始化涉及数字比较的计算时,无穷值就非常方便。例如,在数组中搜索最小值时:

代码语言:javascript
复制
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请求、输入字段的值等)来解析一个数字。在简单的情况下,它会工作得很好:

代码语言:javascript
复制
parseFloat('10.5'); // => 10.5

parseFloat('ZZZ'); // => NaN

这里需要小心的,parseFloat()'Infinity'字符串解析为实际的Infinity数:

代码语言:javascript
复制
parseFloat('Infinity'); // => Infinity

另一个是使用parseInt()来解析整数,它无法将'Infinity'识别为整数:

代码语言:javascript
复制
parseInt('10', 10); // => 10

parseInt('Infinity', 10); // => NaN
5.2 JSON 序列化

JSON.stringify()Infinity数字序列化为null

代码语言:javascript
复制
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

代码语言:javascript
复制
2 * Number.MAX_VALUE; // => Infinity
Math.pow(10, 1000);   // => Infinity
5.4 Math 函数

JS 中Math命名空间的某些函数可以返回Infinity:

代码语言:javascript
复制
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 === Infinitytrue。特殊的函数Number.isFinite()确定提供的参数是否是一个有限的数字。

在涉及数字比较的算法时,可以使用Infinite初始化变量,用例是寻找数组的最小值。

解析来自输入的数字时,必须小心InfinityNumber('Infinity')parseFloat('Infinity')返回实际的Infinity。 当使用JSON.stringify()序列化时,Infinity变为null


原文:https://dmitripavlutin.com/in...

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Infinity(无穷)的定义
  • 2. Infinity 的特性
    • 2.1 负无穷
    • 3.判断无穷
    • 4. 无穷的的使用情况
    • 5. Infinity 的的一些坑
      • 5.1. 解析数据
        • 5.2 JSON 序列化
          • 5.3 最大数溢出
            • 5.4 Math 函数
            • 总结
            相关产品与服务
            文件存储
            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档