在过去,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