在 JavaScript 中,Number 类型的数据表示范围比较有限,最大值约为 2 的 53 次方。如果需要表示更大的数字,就需要使用 BigInt 类型。BigInt 类型是 ES11 新增的数据类型,用于表示任意精度的整数。
BigInt 的创建
创建一个 BigInt 类型的数据,可以使用 n
前缀将一个整数字面量转换成 BigInt 类型,也可以调用 BigInt()
方法将一个已有的数字、字符串或布尔值类型转换成 BigInt 类型。例如:
const a = 123456789012345678901234567890n; // 创建一个 BigInt 类型的常量 const b = BigInt(12345678901234567890); // 用于转换成 BigInt 类型 const c = BigInt('123456789012345678901234567890'); // 用于转换成 BigInt 类型
BigInt 的运算
BigInt 类型支持的运算符和 Number 类型基本一致。不过要注意的是,BigInt 类型和 Number 类型之间不可以直接进行运算。例如:
const a = 123456789012345678901234567890n; // 创建一个 BigInt 类型的常量 const b = 12345678901234567890; // 创建一个 Number 类型的常量 const c = a + b; // TypeError: Cannot mix BigInt and other types
如果需要将 BigInt 类型和 Number 类型进行运算,需要先将 Number 类型转换成 BigInt 类型,或将 BigInt 类型转换成 Number 类型。例如:
const a = 123456789012345678901234567890n; // 创建一个 BigInt 类型的常量 const b = 12345678901234567890; // 创建一个 Number 类型的常量 const c = a + BigInt(b); // 将 Number 类型转换成 BigInt 类型 const d = Number(a) + b; // 将 BigInt 类型转换成 Number 类型
BigInt 的方法
BigInt 类型是内建对象 BigInt 的一个实例,具有与 Number 类型类似的方法。例如,BigInt.prototype.toString()
方法可以将 BigInt 类型转换成字符串类型,BigInt.prototype.valueOf()
方法可以将 BigInt 类型转换成 Number 类型。还有一些方法是 Number 类型没有的,例如 BigInt.prototype.asUintN()
方法和 BigInt.prototype.asIntN()
方法,它们的功能是将一个 BigInt 类型的数据限制在一个指定的位数内。
const a = 467n; // 创建一个 BigInt 类型的常量 const b = a.toString(); // 将 BigInt 类型转换成字符串类型 const c = a.valueOf(); // 将 BigInt 类型转换成 Number 类型 const d = a.asUintN(8); // 将 a 限制在 8 位二进制位内并返回结果 const e = a.asIntN(8); // 将 a 限制在 8 位二进制位内并返回结果
BigInt 和普通整数的区别
BigInt 类型的数据是通过填充二进制位来存储的,它的数字精度不再受到存储限制,因此可以表示任意大的数字。
Number 类型的数据则是按照 IEEE754 标准规定的格式存储的,最高可达到 2 的 53 次方。如果超过这个范围,就会产生精度问题,例如:
const a = 9007199254740991; // 创建一个 Number 类型的常量 const b = 9007199254740992; // 创建一个 Number 类型的常量 console.log(a === b); // true
在这个例子中,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