ES10 中的新特性:BigInt 类型

在 ES10 中,新增了一种基本数据类型:BigInt 类型。它可以表示任意大的整数,不受 JavaScript 中 Number 类型的精度限制。

BigInt 类型的定义

在 JavaScript 中,用 Number 类型表示的整数最大为 2^53 - 1。如果超过这个范围,就会出现精度问题。例如:

console.log(9999999999999999);  // 10000000000000000

因为本应该输出的是 9999999999999999,而由于 Number 类型的精度问题,输出结果变成了 10000000000000000

为了解决这个问题,ES10 引入了 BigInt 类型。BigInt 类型是一种整数类型,表示任意大的整数。它以 n 结尾的数字字面量表示,例如:

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

BigInt 类型的运算

Number 类型一样,BigInt 类型也支持基本的数学运算和比较运算符。但需要注意,Number 类型和 BigInt 类型不能混合运算。例如:

const a = 123456789012345678901234567890n;
const b = 1;
console.log(a + b);  // TypeError: Cannot mix BigInt and other types, use explicit conversions

需要使用 BigInt() 函数将 Number 类型转换成 BigInt 类型:

const a = 123456789012345678901234567890n;
const b = BigInt(1);
console.log(a + b);  // 123456789012345678901234567891n

BigInt 类型的操作

BigInt 类型还支持一些与位运算相关的操作,例如左移、右移和按位非、按位与、按位或等操作。我们可以用这些操作实现一些高精度的运算。

例如,我们可以实现高精度加法和乘法:

// 高精度加法
function bigIntAdd(a, b) {
  const result = [];
  let carry = 0;
  for (let i = 1; i <= Math.max(a.length, b.length); i++) {
    const sum = (a[a.length - i] || 0n) + (b[b.length - i] || 0n) + carry;
    result.unshift(sum % 10n);
    carry = sum / 10n >> 0n;
  }
  if (carry) {
    result.unshift(carry);
  }
  return result.join('') + 'n';
}

// 高精度乘法
function bigIntMultiply(a, b) {
  const result = [];
  for (let i = 0; i < a.length; i++) {
    let carry = 0n;
    for (let j = 0; j < b.length; j++) {
      const product = a[a.length - 1 - i] * b[b.length - 1 - j] + carry + (result[i + j] || 0n);
      result[i + j] = product % 10n;
      carry = product / 10n >> 0n;
    }
    if (carry) {
      result[i + b.length] = carry;
    }
  }
  return result.reverse().join('') + 'n';
}

const a = 123456789012345678901234567890n;
const b = 987654321098765432109876543210n;
console.log(bigIntAdd(a, b));  // 1111111110111111111011111111100n
console.log(bigIntMultiply(a, b));  // 121932631137021795295510913119027661917984929683609529835526729010n

BigInt 类型的应用

BigInt 类型可以解决一些高精度计算的问题,例如计算斐波那契数列:

function fibonacci(n) {
  let a = 0n, b = 1n;
  for (let i = 0; i < n; i++) {
    const t = b;
    b = a + b;
    a = t;
  }
  return a;
}

console.log(fibonacci(100));  // 354224848179261915075n

BigInt 类型还可以用于计算哈希值、加密等领域。

总结

BigInt 类型是 ES10 新增的一种基本数据类型,它可以表示任意大的整数。与 Number 类型相比,它的精度更高,也更适合一些高精度计算的场景。但需要注意,BigInt 类型和 Number 类型不能混合运算,需要使用 BigInt() 函数进行转换。

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