用任意精度整数开发 JavaScript:ECMAScript 2019 中的 BigInt 类型详解!

阅读时长 5 分钟读完

ECMAScript 2019(ES2019)为 JavaScript 增加了一项新功能,即 BigInt 类型。 BigInt 类型是一种用于表示任意精度整数的内置类型,可以处理超出 JavaScript 数字范围的整数。

为什么需要 BigInt?

在 JavaScript 中,我们可以使用 Number 类型来表示整数和浮点数。但是,JavaScript 中的数字类型仅支持有限的精度,无法处理超出其范围的数值。实际上,当数字超出最大安全整数范围时,JavaScript 会将它们转换为浮点数,这就导致了精度问题。

例如,如果我们尝试计算超出最大安全整数范围的两个数字:

这个结果并不正确,因为实际上这两个数字相加的结果是 9007199254741091。原因是,JavaScript 将 9007199254740991 转换为浮点数,再执行加法计算,导致精度损失。

为了解决这个问题,ECMAScript 2019 引入了 BigInt 类型,用于表示任意精度的整数。

如何使用 BigInt?

在 ES2019 中,我们可以使用 BigInt() 函数将数字转换为 BigInt 类型。例如:

注意,我们不能直接使用 new BigInt() 来创建 BigInt 类型的实例,因为 BigInt 类型不是构造函数(Constructor)。

我们可以使用后缀 n 来表示 BigInt 类型的字面量。例如:

要判断一个值是否属于 BigInt 类型,我们可以使用 typeof 运算符或者 instanceof 运算符。例如:

BigInt 的运算

与 JavaScript 中的其他数字类型一样,BigInt 类型也支持基本的算术运算和位运算。例如:

-- -------------------- ---- -------
----- - - ----
----- - - ---
------------- - --- -- -- ---
------------- - --- -- -- --
------------- - --- -- -- ---
------------- - --- -- -- --
------------- - --- -- -- --
------------- -- --- -- -- -----
---------------- -- --------- --------

可以看到,与 JavaScript 中的其他数字类型不同,BigInt 类型不支持位运算。因为位运算通常用于处理低位精度问题,而 BigInt 类型已经解决了这个问题。

除了基本的运算符,BigInt 类型还支持一些其他的方法。例如,BigInt.asIntN()BigInt.asUintN() 方法可以将 BigInt 类型的值截断为指定位宽度的整数,分别表示有符号整数和无符号整数。例如:

BigInt 的限制

虽然 BigInt 类型可以处理超出 JavaScript 数字范围的整数,但是在实际应用中,我们也需要注意 BigInt 类型的限制。

首先,由于 BigInt 类型使用了更多的内存空间,因此性能会略低于普通的 JavaScript 数字类型。其次,由于 BigInt 类型无法进行位运算,因此在需要进行位运算的场景下,不能使用 BigInt 类型。最后,由于 BigInt 类型的运算支持较少,需要使用额外的库来进行更复杂的运算。

总结

ECMAScript 2019 中的 BigInt 类型为 JavaScript 开发者提供了一种处理超出 JavaScript 数字范围的整数的方法。虽然 BigInt 类型具有一些限制,但是在需要处理超大整数的场景下,它是一个非常有用的工具。

示例代码

以下是一些使用 BigInt 类型的示例代码。

计算阶乘:

-- -------------------- ---- -------
-------- ------------ -
  -- -- --- -- -- - --- --- -
    ------ ---
  - ---- -
    ------ - - ----------- - ----
  -
-

---------------------------- -- -- ------------------------------------------------------------------

计算斐波那契数列:

-- -------------------- ---- -------
-------- ------------ -
  --- - - ---
  --- - - ---
  --- ---- - - --- - - -- ---- -
    --- -- - --- - - ---
  -
  ------ --
-

----------------------------- -- -- ----------------------

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/652cfeb07d4982a6ebe7ea8b

纠错
反馈