ES2020:如何实现 JavaScript 中长时运行的操作 ——BigInt

在 JavaScript 中,数字类型默认是以 64 位浮点数的形式存储的,这意味着在处理大型数字时,精度和性能都会受到影响。ES2020 引入了一个新的原生数据类型 BigInt,它可以帮助我们处理超过 2 的 53 次方的数字,同时保证精度和性能。

BigInt 是什么?

BigInt 是一个表示任意精度整数的原生数据类型。它可以处理任意大的整数,而不会失去精度。BigInt 的值可以是任何整数,包括负数。它的语法是在数字后面加上一个 n,例如:

const bigIntNumber = 1234567890123456789012345678901234567890n;

BigInt 的优点

BigInt 的引入解决了 JavaScript 中处理大型整数时的精度和性能问题。BigInt 与普通数字类型相比,有以下优点:

  • 精度:BigInt 可以处理超过 2 的 53 次方的数字,而不会失去精度。
  • 性能:BigInt 的处理速度与普通数字类型相比略慢,但是在处理大型数字时,BigInt 的性能更好。

BigInt 的限制

BigInt 有一些限制,需要我们注意:

  • 不能使用运算符 +、-、*、/、% 和 ++、-- 对 BigInt 进行操作,需要使用 BigInt 对应的运算符。
  • BigInt 不能与普通数字类型进行混合操作,需要先将普通数字类型转换为 BigInt 类型。

BigInt 的运算符

BigInt 支持以下运算符:

  • 加法:+
  • 减法:-
  • 乘法:*
  • 除法:/
  • 取模:%
  • 指数运算:**

示例代码:

const a = 1234567890123456789012345678901234567890n;
const b = 9876543210987654321098765432109876543210n;

console.log(a + b); // 11111111111111111111111111111111111111100n
console.log(a - b); // -8641975320864197532086419753108641975320n
console.log(a * b); // 12193263113702179586097851464084505669720720354881313580246913580246913580246900n
console.log(a / b); // 0n
console.log(a % b); // 1234567890123456789012345678901234567890n
console.log(a ** 2); // 1524157875323883675049535156256668194500838287337600979633967572487660024906258226909633967572487660024906258226900n

BigInt 的转换

如果需要将 BigInt 转换为普通数字类型,可以使用 Number() 或 BigInt.asIntN() 方法。如果 BigInt 的值超出了普通数字类型的范围,转换结果将是不准确的。

示例代码:

const a = 1234567890123456789012345678901234567890n;
const b = Number(a); // NaN
const c = BigInt.asIntN(64, a); // 12345678901234567890n

如果需要将普通数字类型转换为 BigInt,可以使用 BigInt() 方法。

示例代码:

const a = 1234567890123456789012345678901234567890;
const b = BigInt(a);

BigInt 的应用场景

BigInt 的引入解决了 JavaScript 中处理大型整数时的精度和性能问题,适用于以下场景:

  • 处理密码学算法中的大质数计算。
  • 处理高精度计算。
  • 处理大型数据集合的排序和搜索。

总结

BigInt 的引入让 JavaScript 可以处理超过 2 的 53 次方的数字,保证了精度和性能。但是,在使用 BigInt 时需要注意一些限制,比如不能使用普通数字类型的运算符,需要使用 BigInt 对应的运算符。BigInt 的引入扩展了 JavaScript 的应用场景,使其更加适用于处理大型数据集合的排序和搜索、密码学算法中的大质数计算、高精度计算等场景。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c2d926add4f0e0ffcbae0d