随着数字化生活的发展,大数字运算越来越普遍。在 JavaScript 中,数字类型值得关注,尤其是涉及到超过 Number.MAX_SAFE_INTEGER (2^53 - 1)之内的数字时。ECMAScript 2020 (ES11) 规范中引入了 BigInt 类型和 BigInt 数组,以解决这个问题。
BigInt 简介
BigInt 是一种特殊的数字类型,它支持更大的整数范围,从而可以避免因为浮点数精度限制导致的错误。在 JavaScript 中,可以使用构造函数 BigInt() 或者后缀 n 来创建 BigInt 数字。
以下是一个示例:
const a = BigInt(9007199254740991); const b = 2n; const c = a + b; console.log(c); // 输出 "9007199254740993n"
BigInt 类型值通过添加一个后缀 n(例如,10n)来表示。
BigInt 数组简介
BigInt 数组是 ES11 新增的数据结构,它支持大于 Number.MAX_SAFE_INTEGER 的整数数组,并且可以高效地进行极大数值的运算。BigInt 数组可以通过实例化 BigInt64Array 或 BigUint64Array 来创建。BigInt64Array 存储有符号的 BigInt 值,而 BigUint64Array 存储无符号 BigInt 值,因此领域不同:
const bigIntArray = new BigInt64Array(3); bigIntArray[0] = 9007199254740991n; bigIntArray[1] = -9007199254740991n; // 可以使用负的 BigInt 值 bigIntArray[2] = 2n; console.log(bigIntArray); // 输出 "[9007199254740991n, -9007199254740991n, 2n]"
const bigUintArray = new BigUint64Array(2); bigUintArray[0] = 18446744073709551614n; // 大于 Number.MAX_SAFE_INTEGER bigUintArray[1] = 10n; console.log(bigUintArray); // 输出 "[18446744073709551614n, 10n]"
示例:计算阶乘
下面是一个使用 BigInt 数组计算阶乘的示例代码。该函数接受一个正整数 n,返回一个由 n! 的每个十进制位组成的数组。
-- -------------------- ---- ------- -------- ------------ - -- -- - -- ------ --- -- -- --- -- ------ ----- --- --- - --- -------------------- -- ---- ------ - --- --- --- - -- -- -------- --- ---- - - -- - -- -- ---- - --- ----- - --- --- ---- - - -- - - ---- ---- - ----- --- - ------ - --------- - ------ ----- - --- - -------------------- - --- ------ - --- - --------------------- - -- ------ - -- - ---------- - ------ - - ------ -------------------------- ---------------- -
使用上面的代码,可以非常有效地计算任意大小的输入。
总结
BigInt 和 BigInt 数组是 ES11 中为解决超过 Number.MAX_SAFE_INTEGER 的整数值而引入的新语言特性。它们使得 JavaScript 更适合执行涉及大数字的计算。在实践中,开发人员应该仔细考虑是否使用 BigInt 类型:当需要处理号码超过 Number.MAX_SAFE_INTEGER 的场景时,或者需要保证精确度时,BigInt 类型是首选的数据类型。
另外,BigInt 数组和普通数组有一些不同之处,例如它们的元素类型以及底层内存结构,在使用时需要注意这些细节。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651784e795b1f8cacdfb3bf3