ECMAScript 2020(ES2020)是 JavaScript 的最新版本,其中加入了 BigInt 类型。这种类型允许大整数的精确计算,而不会出现精度丢失或溢出。在本文中,我们将深入学习 BigInt 类型的进阶应用,以及如何在项目中使用它。
BigInt 类型简介
在 JavaScript 中,数字类型有一个称为 Number 的内置类型,但是它对于表示大数时会有一些限制。例如,当我们尝试表示非常大的数字时,会出现以下问题:
console.log(9999999999999999); // 10000000000000000 console.log(9007199254740992 + 1 === 9007199254740992); // true
如上例所示,当数字过大时,它们将被转换为科学计数法。另外,对于非常大的数字,求和两个数字时会出现精度错误,在这种情况下,最后的求和结果会逐渐逼近数字的最大值并出现错误。
BigInt 与 Number 不同的是,它没有这些限制,并且可以表示非常大的整数。它提供闭包与方法,并且支持大整数的基本运算、位运算和比较运算。在 BigInt 中,使用n
作为数字结束符。
例如:
const a = 9007199254740991n; console.log(a + 10n); // 9007199254741001n const b = BigInt(2) ** 53n; // 2 ** 53 console.log(b); // 9007199254740992n console.log(Math.pow(2, 53)); // 9007199254740992
BigInt 与 Number 的转换
当需要将 Number 转换为 BigInt 时,可以使用 BigInt() 函数,例如:
const a = BigInt(9007199254740991); // 这将把数字 9007199254740991 转换为 BigInt 类型
而将 BigInt 转换为 Number 可以使用 Number() 函数,例如:
const b = BigInt(9007199254740992); console.log(Number(b)); // 9007199254740992
需要注意的是,当 BigInt 转换为 Number 时(通过 Number() 函数),当 BigInt 值大于 Number 能够表示的最大范围时,结果将出现不确定错误。
进阶应用
1. 精确计算
在 JavaScript 中,对于普通数字类型的计算,我们需要考虑精度问题。而在 BigInt 中,我们不需要考虑这个问题,这是因为 BigInt 中可以存储极大的整型数字。
假设我们想计算非常大的数字的阶乘:
function factorial(n) { if (n <= 1) return 1; return BigInt(n) * factorial(n - 1); } console.log(factorial(100)); // 9332621544394415268169923885626670049071596826438162146859296389521759999322991560894146397615651828625369792082722375825118521091686400000000000000000000000n
BigInt 还提供其他基本的数学运算,如加、减、乘、除等操作,如下所示:
console.log(BigInt(123) + BigInt(456)); // 579n console.log(BigInt(123) - BigInt(456)); // -333n console.log(BigInt(123) * BigInt(456)); // 56088n console.log(BigInt(123) / BigInt(456)); // 0n
2. 位运算
在 BigInt 中,提供了常见的位运算操作,如与(&)、或(|)、异或(^)、移位(<<, >>, >>>)等。同时,还提供了一些方法来操作。 例如:
const a = 0b1010n; // 10; const b = 0b1100n; // 12; console.log(a & b); // 0b1000n, 8 console.log(a | b); // 0b1110n, 14 console.log(a ^ b); // 0b0110n, 6 console.log(~a); // -11 也就是 0b1111111111111111111111111111111111111111111111111111111111110101n console.log(a << 10n); // 0b10100000000000n 。移动 10 位,相当于 000000001010 << 10,不需要补 0。 console.log(a >> 2n); // 0b10n, 2
3. 支持和 Number 的数字运算
在计算时,可能需要将 BigInt 混合使用与普通 Numbers 数字运算。在这种情况下,我们需要将一个数字或浮点数转换为 BigInt,而不是用数字或浮点数的值实例化它来保持精度。反之亦然。
一种方法是将其转换为字符串,并使用 BigInt() 函数。例如:
const a = BigInt(10) + BigInt("9007199254740991"); console.log(a); // 9007199254741001n
而将 BigInt 转换为 Number 时可以使用 Number() 函数。例如:
const b = BigInt(9007199254740992) + 1n; console.log(Number(b)); // 9007199254740993
需要注意的是,在这种情况下,更好的使用方法并不是将 BigInt 转换为一个 Number 数字(可能会出现精度错误),而是使用 BigInt 进行数字计算。
总结
BigInt 让 JavaScript 能够更加容易地运行大整数。通过 BigInt 类型,我们可以执行精确的运算,避免了 Number 类型的精度误差。本文介绍了 BigInt 在进阶应用方面的用法,如精确计算、位运算和支持 Number 运算等。我们相信这里提供的信息将对你在项目中使用 BigInt 类型会有一定帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649ba3da48841e9894868ccb