深入理解 JavaScript Bigint 类型

2 阅读7分钟

深入理解 JavaScript Bigint 类型

引言

嘿,大家好!我是墩墩大魔王丶,今天我们来聊一聊 JavaScript BigInt 类型。在我们日常的前端开发中,处理数字是非常常见的一件事情。但是你知道吗?在传统的 JavaScript 中,处理大整数时可是有点头疼的。为了解决这个问题,JavaScript 在 ECMAScript 2019 标准中引入了 BigInt 类型。那么 BigInt 究竟是什么呢?有什么特点和用途呢?让我们一起来深入了解一下!

背景

在不久之前的 ECMAScript 2019 标准中,JavaScript 中的数字表示存在着一个小小的限制。你能想象一下吗?如果数字太大,它们可能会失去一些精度,结果就不太准确了。比如,假设我们要表示一个非常大的整数,比如 9007199254740993。在 JavaScript 中,我们可以用以下代码表示这个数字:

const largeNumber = 9007199254740993;
console.log(largeNumber); // 输出:9007199254740992

然而,你会发现输出的结果并不是我们期望的 9007199254740993,而是 9007199254740992。这是因为在 JavaScript 中,数字的精度是有限的,无法准确表示这么大的整数,从而导致了精度丢失的问题。

JavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个值。

最小安全负整数: -(2^53-1) = -9007199254740991

最大安全正整数: 2^53-1 = 9007199254740991

最大数值 Number.MAX_VALUE 属性值接近于 1.79E+308。大于 MAX_VALUE 的值代表 "Infinity";

最小的正值 Number.MIN_VALUE 属性值约为 5e-324,是 JavaScript 里最接近 0 的正值,而不是最小的负值,小于 MIN_VALUE 的值将会转换为0;

为了解决这个问题,JavaScript 引入了 BigInt 类型,它可以帮助我们表示任意大小的整数,避免了精度丢失的情况。

基本用法

现在,让我们来看看如何使用 BigInt。首先,你可以用 n 后缀或者 BigInt() 函数来创建一个 BigInt 变量。比如:

const bigNum1 = 1234567890123456789012345678901234567890n;
const bigNum2 = BigInt("1234567890123456789012345678901234567890");

在上面的例子中,我们使用了两种不同的方法来创建 BigInt 变量。一种是在整数字面量后面加上 n 后缀,另一种是使用 BigInt() 函数,并传递一个整数值或字符串值作为参数。

除了创建之外,你还可以对 BigInt 进行基本的操作和运算。比如加减乘除,取余等。看下面这个例子:

const a = 123456789012345678901234567890n;
const b = 987654321098765432109876543210n;

const sum = a + b;
console.log(sum); // 输出:1111111111111111111012345678900n

特性与应用

BigInt 可以表示任意精度的整数,这使得它在一些特定的场景下非常有用。比如在密码学中,处理大素数和大整数时就需要使用 BigInt 类型。另外,在处理大数据和科学计算等领域,BigInt 也发挥着重要作用。

下面是一个简单的示例,演示了如何使用 BigInt 来计算斐波那契数列的第 n 项:

function fibonacci(n) {
  let a = 0n, b = 1n;
  for (let i = 0; i < n; i++) {
    [a, b] = [b, a + b];
  }
  return a;
}
console.log(fibonacci(100)); // 输出:354224848179261915075n

在 B 端项目中,JavaScript BigInt 类型有着多种具体的应用案例:

  1. 金融系统:在金融系统中,处理货币金额、交易编号等需要处理大整数。使用 BigInt 类型可以确保处理这些大数字时不会丢失精度,保障系统的准确性和可靠性。
  2. 订单编号:在电商平台或企业管理系统中,订单编号通常是一个很大的整数。使用 BigInt 类型可以确保订单编号的唯一性和准确性,避免重复或错误的情况发生。
  3. 数据库操作:在数据库操作中,有时需要处理主键、自增 ID 等大整数。特别是在处理大量数据时,BigInt 类型可以保证数据库操作的准确性和性能。
  4. 加密算法:在加密算法中,处理大素数和大整数是很常见的。使用 BigInt 类型可以确保加密过程中不会丢失精度,提高加密算法的安全性和可靠性。
  5. 数据分析:在数据分析和统计计算中,处理大整数或精确数值是必须的。BigInt 类型可以确保数据分析的准确性,避免误差和偏差的出现。

后端返回的数据 大于 9007199254740991 前端怎么用Bigint接收?

将数据转换为字符串:由于 JavaScript 中的 Number 类型无法精确表示超过 9007199254740991 的大整数,因此 后端应将这些大整数转换为字符串进行传输

在前端使用 BigInt() 函数创建 BigInt 对象:前端接收到字符串形式的大整数后,可以使用 BigInt() 函数将其转换为 BigInt 对象。示例如下:

// 后端返回的字符串形式的大整数
const bigNumberString = "1234567890123456789012345678901234567890";

// 使用 BigInt() 函数将字符串转换为 BigInt 对象
const bigIntNumber = BigInt(bigNumberString);

// 对 BigInt 对象进行操作
const result = bigIntNumber * 2n;
console.log(result); // 输出:2469135780246913578024691357802469135780n

// 将 BigInt 对象转换为字符串
const bigIntString = result.toString();

兼容性与注意事项

当然啦,虽然 BigInt 类型为我们带来了很多便利,但是需要注意的是它并不是所有浏览器都支持的。在使用 BigInt 时,我们需要确保我们的目标浏览器支持它,或者使用相应的兼容性方案。另外,虽然 BigInt 可以表示任意精度的整数,但是在运算过程中也需要注意内存占用和性能方面的问题。

结语

通过这篇文章,相信你已经对 JavaScript BigInt 类型有了更深入的理解。BigInt 类型不仅解决了传统 JavaScript 中处理大整数时的精度丢失问题,而且在密码学、科学计算等领域有着广泛的应用前景。尽管在兼容性和性能方面需要注意一些问题,但是随着技术的不断发展,BigInt 类型必将在前端开发中扮演越来越重要的角色。


希望这篇文章能够帮助你更好地理解和应用 BigInt 类型,让你的前端开发之路更加顺畅!