ES10 新特性 BigInt 支持 JavaScript 中的大整数计算

在过去,JavaScript 中只能计算 53 位以内的整数。一旦超出了这个范围,就会出现计算错误。为了解决这个问题,ECMAScript 2020(ES10)引入了 BigInt,用于支持 JavaScript 中的大整数计算。

什么是 BigInt?

BigInt 是一种全新的数据类型,用于表示任意长度的整数。BigInt 在 JavaScript 中使用字符串来以十进制数形式表示,并通过前缀 n 来定义一个 BigInt 变量。例如,下面的代码定义了一个 BigInt 数字:

const bigNum = 1234567890123456789012345678901234567890n;

其中,后缀 n 表示这是一个 BigInt 值,而不是普通的数字。

注意事项

  • BigInt 不支持与普通数字(Number)相乘、相除和相减,只能与 BigInt 进行这些操作。
  • 使用简单的算术运算符时,BigInt 会自动将数字转换为 BigInt。例如,1n + 2 将自动将数字 2 转换为 BigInt。
  • 使用 BigInt 时需要特别注意性能问题。大的整数计算可能需要使用更长的时间和更多的内存。

BigInt 的运算

目前,BigInt 支持以下运算:

加法

const a = 1234567890n;
const b = 9876543210n;
const c = a + b;
console.log(c); // 输出:11111111100n

减法

const a = 9876543210n;
const b = 1234567890n;
const c = a - b;
console.log(c); // 输出:8641975320n

乘法

const a = 1234567890123456789n;
const b = 9876543210123456789n;
const c = a * b;
console.log(c); // 输出:12193263113702179547847262980965278421n

除法

const a = 12193263113702179547847262980965278421n;
const b = 9876543210123456789n;
const c = a / b;
console.log(c); // 输出:1234567890n

幂运算

const a = 1234567890n;
const b = 100n;
const c = a ** b;
console.log(c); // 输出:20589113209464900000000000000n

深度解析

对于大多数计算机语言来说,整数的存储结构都是相似的:将整数拆分成多个字节,每个字节存储 8 位,而每一位只存储 0 或 1。这种存储方式叫做二进制补码。

在 JavaScript 中,一个数的整数部分最多只能是 2 的 53 次方(2^53),因为它被存储在浮点数中,并且只有 53 位有效数字。

这就限制了 JavaScript 中整数的范围。例如,如果我们需要处理一个超出 2^53 的整数,它将被截断并且可能无法得到准确的结果。BigInt 的引入可以解决这个问题。BigInt的每一位可以存储更大的数字(需要更多的内存),从而扩展了能表示的整数的范围。

BigInt 的兼容性

目前,BigInt 还没有被所有现代浏览器完全支持。在 Safari 和 IE 中,BigInt 甚至都不被支持。但是,我们可以通过 polyfill 来解决这个问题。

在 polyfill 中,我们可以直接在代码中使用 BigInt 语法,polyfill 会帮我们转换为兼容的代码。利用 polyfill 方法可以解决大多数兼容性问题。

下面是 polyfill 的示例代码:

// polyfill 前需要先安装 "big-integer" 模块
const bigInt = require('big-integer');

const bigNum = bigInt('1234567890123456789012345678901234567890');
console.log(bigNum.add('9876543210123456789')
        .subtract('1234567890')
        .multiply('100')
        .divide('9876543210123456789')
        .pow(2)
        .toString()); // 输出:3650479023051431617471980825823744405010514014490763016936253644226900

总结

BigInt 是一个全新的数据类型,用于表示任意长度的整数,并且允许我们在 JavaScript 中进行大整数计算。BigInt 的引入很好地解决了 JavaScript 中整数范围的限制问题。

在实践中,我们需要注意 BigInt 的运行性能和兼容性问题,并根据实际需要进行兼容性兼容处理。现在是时候开始使用 BigInt 了。

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


纠错反馈