首页 > 解决方案 > JavaScript 中的“BigInt”是什么?

问题描述

最近,在与我的一位同事的讨论中,我听说了 JavaScript 中的这种新数据类型 - BigInt.

到目前为止我知道的事情: 在 JavaScript 中,使用Number类型有一个限制;它不能安全地表示大于 的整数值2 to the power of 53。这种限制经常迫使开发人员使用低效的解决方法和第三方库来表示更大的数字。BigInt是一种旨在解决此问题的新数据类型。

我想知道的事情:( 为了更清楚,一个问题分为两点)


除了上面的问题,还有一些需要考虑的额外问题:( 添加此处仅供参考):有时,我写了一篇关于JavaScript 中的数字在运行时可以达到 Infinity 的 SO 帖子吗?. JavaScript 中的特定场景是否会因引入BigInt.

标签: javascriptecmascript-6numbers

解决方案


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 万位”。)


推荐阅读