ES10 中 BigInt 类型带来大数据处理的新思路和用法

在 JavaScript 中,数字类型代表着数值大小的限制。在 ES6 之前,数字类型被限制在 -2^53 ~ 2^53-1 的范围内,超出这个区间的值会导致精度误差和运算错误。这种限制对于某些场景下需要处理大数据的开发者来说,是一种瓶颈和困扰。而在 ES10 中,新增的 BigInt 类型带来了全新的思路和方法,让 JavaScript 可以处理任意大小的整型数据。本文将深入探讨 BigInt 类型的内部机制、应用场景和语法特点,以及给出实例代码进行演示和实践。

1. BigInt 是什么?

BigInt 是 JavaScript 中的一个新类型,它可以表示任意大小的整数。一个 BigInt 变量是一个整数,它可以是任何位数,而不受数字类型限制。这使得你能够使用 JavaScript 处理和操作超出数字类型范围的数字。

2. 如何使用 BigInt?

声明 BigInt 变量时,需要在整数后面添加一个 n,表示这是一个 BigInt 类型的整数。如下所示:

const number = 999999999999999n;
console.log(number); // 999999999999999n
console.log(typeof number); // bigint

需要注意的是,BigInt 类型的变量和普通的数字类型是不能相互运算的。下面是一个错误的示例:

const a = 1;
const b = 999999999999999n;
console.log(a + b); // Uncaught TypeError: Cannot mix BigInt and other types

如果你要进行 BigInt 类型的运算,需要使用 BigInt() 方法将数字类型转换成 BigInt 类型,如下所示:

const a = 1;
const b = BigInt(999999999999999);
console.log(a + b); // 1000000000000000n

3. BigInt 实例和函数

在 ES10 中,为了使用 BigInt 更方便,提供了一系列的内置函数进行处理某些特定场景的操作。

3.1 BigInt 对象

BigInt 对象是在应用程序中直接操作 BigInt 的函数集。

BigInt.asIntN

BigInt.asIntN(width, bigint) 返回一个 BigInt 类型的整数,它的值等于给定整数 bigintwidth 位二进制补码下表示的值。

const a = BigInt.asIntN(64, 999999999999999n);
console.log(a); // 999999999999999n

const b = BigInt.asIntN(32, -999999999999999n);
console.log(b); // 232830271n

BigInt.asUintN

BigInt.asUintN(width, bigint) 返回一个 BigInt 类型的整数,它的值等于给定整数 bigintwidth 位二进制无符号整数下表示的值。

const a = BigInt.asUintN(64, -999999999999999n);
console.log(a); // 9000000000000000000n

const b = BigInt.asUintN(32, 4294967295n);
console.log(b); // 4294967295n

3.2 Math 对象

Math 对象是一组常见的数学计算函数。在 ES10 中,对于 BigInt 类型的数字,新增了一些针对性的函数。

Math.clz32

Math.clz32(x) 返回一个数字,在二进制表示中,有多少位是 0。

const a = BigInt(1);
console.log(Math.clz32(a)); // 61
const b = BigInt(2);
console.log(Math.clz32(b)); // 60

Math.imul

Math.imul(x, y) 返回两个参数的乘积,它们是 32 位带符号整数。结果也是一个 32 位带符号整数。

const a = BigInt(2147483647);
const b = BigInt(2);
console.log(Math.imul(a, b)); // -2

Math.max 和 Math.min

Math.max()Math.min() 方法通过比较参数的值来获取最大值或最小值。对于 BigInt,使用 BigInt.compare() 进行比较,再取出最大或最小值。

const a = BigInt(2);
const b = BigInt(100);
const c = BigInt(50);

console.log(Math.max(a, b, c)); // 100n
console.log(Math.min(a, b, c)); // 2n

4. BigInt 应用举例

BigInt 类型可以应用于各种常见的场景,比如计数器、加密、哈希、通信协议等。下面举例说明两个案例。

4.1 斐波那契数列

如下所示是一个斐波那契数列的计算函数,其中使用了 BigInt() 对象,无需再次声明开辟变量空间,可以直接进行任意长度和精度的斐波那契数列计算。

function fibonacci(n) {
  let fib = [BigInt(0), BigInt(1)];
  for(let i = 2; i <= n; i++){
    fib[i] = BigInt(fib[i-1]) + BigInt(fib[i-2]);
  }
  return fib[n];
}
console.log(fibonacci(100)); // 573147844013817084101

4.2 大数字加法

如下所示是一个大数字加法计算函数,其中使用了 BigInt() 对象,可以轻松处理较大位数的数字加法,并输出结果。

function addBigNumber(a, b) {
  let ans = '', cur = 0;
  let lenA = a.length, lenB = b.length;
  let minLen = Math.min(lenA, lenB);
  for(let i = 0; i < minLen; i++){
    cur += Number(a[lenA - 1 - i]) + Number(b[lenB - 1 - i]);
    ans = cur % 10 + ans;
    cur = cur > 9 ? 1 : 0;
  }
  let remain = lenA > lenB ? a : b;
  for(let j = minLen; j < Math.max(lenA, lenB); j++){
    cur += Number(remain[Math.max(lenA, lenB) - 1 - j]);
    ans = cur % 10 + ans;
    cur = cur > 9 ? 1 : 0;
  }
  if(cur === 1) ans = '1' + ans;
  return BigInt(ans);
}

const a = BigInt(9999999999999999999999999999999999999999999999999999999999999999999999999);
const b = BigInt(1);
console.log(addBigNumber(a,b)); // 10000000000000000000000000000000000000000000000000000000000000000000000000000n

5. 总结

ES10 中的 BigInt 类型为 JavaScript 带来了更加宽泛的数值表示范围,解决了数字类型无法处理大数据的问题。通过本文的介绍,我们可以掌握 BigInt 的基本语法和细节注意事项,进而可以运用到实际项目中的场景中。作为前端开发者,在面对超出数字类型范围的数据时,应当灵活采用 BigInt 类型,并结合内置函数和业务场景,实现更加全面和高效的数据处理。

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


纠错反馈