JavaScript中的“ BigInt”是什么?

时间:2019-08-20 09:40:27

标签: javascript ecmascript-6 numbers

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

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

我想知道的事情(为了清楚起见,单个问题分为两点)

  • 在JavaScript中,BigInt的实现/定义方式到底如何?
    • 是否是新的数据类型(类似于NumberBoolean等)?
    • 还是实现类似于MAX_SAFE_INTEGERInfinity-Infinity等现有JavaScript常量的方法?

除了上述问题外,还需要考虑以下事项: (此处添加仅供参考): 有时,我写了关于Can a number in JavaScript ever reach to Infinity in runtime?的SO帖子。通过BigInt的引入,JavaSscript中的特定场景是否会发生变化/受到影响?

2 个答案:

答案 0 :(得分:1)

是的,BigInt是一种新的数据类型,例如...

  typeof 12n === "bigint"

(1)它有自己的类型("bigint"

(2)它有自己的文字(12n

(3)它可以表示不能用number表示的数字。

  

使用BigInt进行计算会导致无穷大吗?

肯定是。您的计算机内存有限。任何类型的数据类型总会有一个上限,但是BigInts的数据类型要比数字的数据类型高得多,因此,达到该限制的可能性很小。

答案 1 :(得分:1)

在第3阶段,BigInt为still a proposal

MDN says

  

当它进入草案的第4阶段(即最终规范)时,BigInt将成为JavaScript中的第二种内置数字类型。

     

BigInt计划成为自ES2015年Symbol以来第一个添加到JavaScript的新基本类型。

您可以在proposal page上看到许多实现示例,有关具体细节,可以阅读proposal specification here

  

还是实现类似于现有JavaScript常量(如MAX_SAFE_INTEGER,Infinity,-Infinity等)的

BigInt不是number,而是一个BigInt。 (对于我们熟悉的现有常量typeof Infinitytypeof MAX_SAFE_INTEGER等等,都以number作为回报)

  

引入BigInt会不会改变JavaSscript中的特定场景?

我认为,当数字太大而无法处理BigInt时,至少在V8中,它将引发RangeError(而不是评估为Infinity的BigInt版本):

3n ** 3n ** 3n ** 3n

  

未捕获的RangeError:超出了最大BigInt大小

请参见discussion

  

V8当前为BigInt允许10亿位。该限制一度是一百万位,但是我们发现遇到了该限制的测试,因此我们对其进行了修改。如果有理由,我们可能会再次提高或降低它。 (就我个人而言,我认为假设“每个实现都会允许至少一百万个比特”是合理的。)