在 ES11 中新增了一个基本数据类型 BigInt,用于表示超出 2^53 - 1 (即 JavaScript 中 Number 类型的最大安全整数) 的整数。BigInt 值可以是一个任意精度的整数,没有在定义时限制最大值,而且操作 BigInt 也可以保持数字的完整性。
如何使用
BigInt 可以通过在整数字面量后添加 n 或者使用 BigInt() 构造函数创建。
const bigIntNumber = 100n; const bigIntNumber2 = BigInt("999999999999999999999999999999999999999999999"); // 超出 2^53 - 1 的安全整数范围
可以使用 typeof 判断一个值是否为 BigInt 类型。
typeof 12345n; // "bigint"
运算操作
与普通数字类型不同,BigInt 无法使用一些特殊值 (如 Infinity 和 NaN),同时也不支持运算符重载。
BigInt 支持 +、-、*、**、/、%、| 、&、^、~、<<、>>、>>> 等运算符,与普通数字类型的运算符相同,只是需要在其中添加一个后缀 n。
const bigIntNumber1 = 100n; const bigIntNumber2 = 1000n; console.log(bigIntNumber1 + bigIntNumber2); // 1100n console.log(bigIntNumber2 ** 2n); // 1000000n console.log(bigIntNumber2 / bigIntNumber1); // 10n console.log(bigIntNumber2 % bigIntNumber1); // 0n console.log(bigIntNumber1 << 2n); // 400n
需要注意的是,BigInt 和普通数字之间的运算会被视为隐式类型转换而抛出错误。
const bigIntNumber1 = 100n; console.log(bigIntNumber1 + 100); // TypeError: Cannot mix BigInt and other types, use explicit conversions console.log(bigIntNumber1 == 100); // false console.log(bigIntNumber1 > 99); // true
BigInt 和 Number 类型的互操作
由于 BigInt 和 Number 之间运算无法进行,因此可以使用 BigInt() 操作函数或.toString() 方法将两种数字转换类型进行运算。
const bigIntNumber = 100n; console.log(Number(bigIntNumber)); // 100 console.log(bigIntNumber.toString()); // "100"
需要注意的是,将超出 Number 类型的大整数转换为 Number 类型将出现精度丢失。
const bigIntNumber = BigInt("999999999999999999999"); console.log(Number(bigIntNumber)); // 1e+21
高精度计算
BigInt 可以用来进行高精度计算,例如开发一个处理大数字的工具。
例如,计算 1000000000000000000n (1亿)这个数的各个位上的数字之和:
-- -------------------- ---- ------- ----- ------------ - --------------------- --- ------ - -- ----- ------------- - -- - ------ -- ------------ - ---- ------------ -- ---- - -------------------- -- --
结论
BigInt 作为新的基本数据类型,扩展了 JavaScript 中可以表示的数字范围,特别是对于需要进行高精度计算的场景,其优势尤为明显。但同时需要注意的是,由于 BigInt 对于内存的使用会存在一定的限制,因此需要谨慎使用,以免在计算过程中出现性能问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674fecb5fbd23cf89070ed98