从 ES11 开始,JavaScript 是如何处理 BigInt 的?

在 JavaScript 中,数字类型默认是双精度浮点型,即 number 类型。这意味着 JavaScript 可以处理的数字范围为 $-2^{53}+1$ 到 $2^{53}-1$。如果想要进行更大的数值计算,之前的解决方案是使用第三方库或将数字拆分成多个较小的部分进行计算。但从 ES11 开始,JavaScript 开始原生支持处理大整数,这就是 BigInt。

什么是 BigInt?

BigInt 是一种新的原生类型,用于表示整数。它可以表示比 Number 更大、更长的整数($2^{53}-1$)。并且 BigInt 不会出现精度损失的问题。

BigInt 类型的变量使用 n 后缀表示,例如 12345678901234567890n

BigInt 的基本操作

BigInt 支持大多数与 Number 相关的操作,但使用方法有所不同。以下是一些例子:

BigInt 的创建

const myBigInt = 12345678901234567890n;
const anotherBigInt = BigInt('12345678901234567890');

BigInt 的算术操作

const a = 123n;
const b = 456n;

console.log(a + b); // 579n
console.log(a - b); // -333n
console.log(a * b); // 56088n
console.log(a / b); // 0n

BigInt 的比较操作

const a = 123n;
const b = 456n;

console.log(a == b); // false
console.log(a != b); // true
console.log(a < b); // true
console.log(a > b); // false
console.log(a <= b); // true
console.log(a >= b); // false

BigInt 的限制和注意事项

如果你试图将 BigInt 类型的值与 Number 类型的值相加,会抛出一个 TypeError 异常。因为 BigInt 和 Number 是两个不同的类型。如果需要相加,需要将 Number 类型的值转换为 BigInt 类型。

const myBigInt = 12345678901234567890n;
const myNumber = 123;

console.log(myBigInt + BigInt(myNumber)); // 12345678901234568013n

如果尝试在 BigInt 中使用小数,它会被截断成整数。例如,1.2n 将被截断为 1n

BigInt 内部计算时,位运算操作符(如 <<>>>>>)被禁用。这是因为位运算操作符只能用于 Number 类型的值。另外,无法对 BigInt 变量使用递增/递减运算符(++--)。

不同类型之间的转换

BigInt 类型支持从 NumberBooleanStringBigInt 转换。下面是一些例子:

从 Number 转换

const myBigInt = BigInt(Number.MAX_SAFE_INTEGER);

从 Boolean 转换

const myBigInt = BigInt(true); // 1n
const myBigInt = BigInt(false); // 0n

从 String 转换

const myBigInt = BigInt('12345678901234567890');

从 BigInt 转换

const myBigInt = BigInt('12345678901234567890');
const myOtherBigInt = BigInt(myBigInt);

BigInt 的应用案例

BigInt 在日常开发中很少用到,但对于一些特殊的场景来说,它是必须的。以下是一些可能用到 BigInt 的案例:

  • 数字签名
  • 网络协议处理
  • 加密
  • 大数据分析

总结

BigInt 是一个新的原生类型,用于解决 JavaScript 中数字范围限制的问题。它可以表示比 Number 更大、更长的整数,并且不会出现精度损失的问题。尽管使用范围和实际应用有限,但在特定场景下,它是必不可少的。

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