ES11 BigInt 详解以及 JavaScript 中 BigInt 的一些特性

阅读时长 5 分钟读完

在 JavaScript 中,Number 类型的数据表示范围比较有限,最大值约为 2 的 53 次方。如果需要表示更大的数字,就需要使用 BigInt 类型。BigInt 类型是 ES11 新增的数据类型,用于表示任意精度的整数。

BigInt 的创建

创建一个 BigInt 类型的数据,可以使用 n 前缀将一个整数字面量转换成 BigInt 类型,也可以调用 BigInt() 方法将一个已有的数字、字符串或布尔值类型转换成 BigInt 类型。例如:

BigInt 的运算

BigInt 类型支持的运算符和 Number 类型基本一致。不过要注意的是,BigInt 类型和 Number 类型之间不可以直接进行运算。例如:

如果需要将 BigInt 类型和 Number 类型进行运算,需要先将 Number 类型转换成 BigInt 类型,或将 BigInt 类型转换成 Number 类型。例如:

BigInt 的方法

BigInt 类型是内建对象 BigInt 的一个实例,具有与 Number 类型类似的方法。例如,BigInt.prototype.toString() 方法可以将 BigInt 类型转换成字符串类型,BigInt.prototype.valueOf() 方法可以将 BigInt 类型转换成 Number 类型。还有一些方法是 Number 类型没有的,例如 BigInt.prototype.asUintN() 方法和 BigInt.prototype.asIntN() 方法,它们的功能是将一个 BigInt 类型的数据限制在一个指定的位数内。

BigInt 和普通整数的区别

BigInt 类型的数据是通过填充二进制位来存储的,它的数字精度不再受到存储限制,因此可以表示任意大的数字。

Number 类型的数据则是按照 IEEE754 标准规定的格式存储的,最高可达到 2 的 53 次方。如果超过这个范围,就会产生精度问题,例如:

在这个例子中,a 和 b 的差值是 1,但是 a 和 b 却相等,这是由于 Number 类型无法表示超过 2 的 53 次方的整数,所以在 b 被转换成 Number 类型时,它的值被截断,和 a 相等了。

BigInt 在实际应用中的使用

BigInt 类型在实际应用中一般用于需要处理大整数的场景,例如密码学算法、数据加密和解密等。例如,使用 BigInt 类型来实现 JavaScript 版本的 RSA 加密算法:

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

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

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

上面的代码中,我们定义了一个 encrypt() 函数来实现 RSA 加密。该函数接受三个参数:需要加密的明文、公钥的指数 e 和模数 n。我们首先将明文转换成十六进制数,然后将其转换成 BigInt 类型,并使用“幂模运算”将其加密。最后将密文转换成字符串类型输出。

总结

  • BigInt 类型是 ES11 新增的数据类型,用于表示任意精度的整数。
  • BigInt 类型支持的运算符和 Number 类型基本一致,但 BigInt 类型和 Number 类型之间不可以直接进行运算。
  • BigInt 类型是内建对象 BigInt 的一个实例,具有与 Number 类型类似的方法,也有一些方法是 Number 类型没有的。
  • BigInt 类型的数据是填充二进制位存储的,最高可达到任意大的数字。
  • BigInt 类型在实际应用中一般用于需要处理大整数的场景,例如密码学算法、数据加密和解密等。

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

纠错
反馈