javascript - JavaScript 中的“BigInt”是什么?
问题描述
最近,在与我的一位同事的讨论中,我听说了 JavaScript 中的这种新数据类型 - BigInt
.
到目前为止我知道的事情:
在 JavaScript 中,使用Number
类型有一个限制;它不能安全地表示大于 的整数值2 to the power of 53
。这种限制经常迫使开发人员使用低效的解决方法和第三方库来表示更大的数字。BigInt
是一种旨在解决此问题的新数据类型。
我想知道的事情:( 为了更清楚,一个问题分为两点)
- 在 JavaScript 中,究竟
BigInt
是如何实现/定义的?- 它是一种新的数据类型(类似于
Number
,Boolean
等)吗? - 或者实现类似于现有的 JavaScript 常量,如,
MAX_SAFE_INTEGER
等?Infinity
-Infinity
- 它是一种新的数据类型(类似于
除了上面的问题,还有一些需要考虑的额外问题:( 添加此处仅供参考):有时,我写了一篇关于JavaScript 中的数字在运行时可以达到 Infinity 的 SO 帖子吗?. JavaScript 中的特定场景是否会因引入BigInt
.
解决方案
BigInt 是一个完成的提案,处于第 4 阶段。
正如MDN 所说:
BigInt 将成为 JavaScript 中的第二个内置数字类型。
BigInt 将成为自 ES2015 中的 Symbol 以来添加到 JavaScript 的第一个新的原始类型。
您可以在提案页面上看到许多实施示例,有关详细信息,您可以在此处阅读提案规范。
或者实现类似于现有的 JavaScript 常量,如 MAX_SAFE_INTEGER、Infinity、-Infinity 等?
BigInt不是number
- 它是 BigInt 。(对于我们熟悉的现有常量,typeof Infinity
等等typeof MAX_SAFE_INTEGER
,都给予number
回报)
Javascript 中的特定场景是否会因 BigInt 的引入而改变/影响?
我认为当数字变得太大而 BigInt 无法处理时,它会抛出 RangeError(而不是评估为 Infinity 的 BigInt 版本),至少在 V8 中:
3n ** 3n ** 3n ** 3n
未捕获的 RangeError:超出最大 BigInt 大小
见讨论:
V8 目前允许 BigInt 有 10 亿位。有一段时间限制是 100 万位,但我们发现测试遇到了这个限制,所以我们撞了它。如果有理由这样做,我们可能会再次提高或降低它。(就个人而言,我认为可以合理地假设“每个实现都将允许至少 100 万位”。)
推荐阅读
- google-kubernetes-engine - API Gateway Using Ambassador 的安装问题
- htmx - 如何在 HTMX 中重新加载页面刷新时的所有部分
- c++ - 如何在 C++ 中处理时间?
- python - 如何使用 for 循环计算总和并将结果相加?
- amazon-web-services - AWS:Linux/UNIX 平台不适用于弗吉尼亚北部地区的预留实例
- python - 从 csv 读取嵌套列表到 pandas
- python-3.x - 关于 Singleton 模式中惰性实例化的两个问题
- r - 减小 R 中的栅格大小
- reactjs - 如何使用 firebase 中的两种“ref”方法?
- c - 为什么 fgets 不将 char 指针作为第一个参数?