随着数字技术的不断发展,数字计算的需求也愈发复杂。JavaScript 作为一门支持数字计算的语言,当然也不例外。在 ECMAScript 2017 标准中,新增加了 BigInt 类型,以方便处理超过 Number 类型最大安全整数 (2^53 - 1) 的整数,本文将详细介绍 BigInt 的使用。
BigInt 类型的定义和使用
BigInt 可以表示任意精度的整数,且可表示为整数字符串或者 Number 类型。BigInt 字面量可以通过在末尾添加 n
来表示,如下,表示一个值为 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
的 BigInt。
const bigNumber = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000n;
BigInt 类型的操作
BigInt 的支持的操作与 Number 有些类似。在如果两个 BigInt 进行混合运算时,会抛出一个错误,需要进行类型转换,如下。
const x = 1n; const y = 2; const result = x + BigInt(y);
BigInt 类型只支持以下操作:
+
-
*
除和取模%
。- 按位操作符
|
^
&
<<
>>
>>>
~
。 - 通过方法进行操作
BigInt.toString()
,BigInt.toJSON()
,BigInt.valueOf()
。
BigInt 类型与 Number 类型的转换
可以使用 Number 类型的值来创建 BigInt 变量,需要使用 BigInt()
函数。如果超过了 Number 类型的最大值,自动被转换成 BigInt 类型。前缀为 0b
,0o
,0x
的字符串也可以用于创建 BigInt,如下。
const bigNumber1 = BigInt(Number.MAX_SAFE_INTEGER) + 1n; const bigNumber2 = BigInt(100); const bigNumber3 = BigInt("0x1f"); const bigNumber4 = BigInt("0b101010");
需要注意的是,使用 BigInt 变量进行数学运算时,需要使用 BigInt 类型,如下。
const x = 1n; const y = BigInt(2); const result = x + y;
使用 BigInt 转换为 Number 时,小数的精度将会被丢失。需要使用 Number.parseInt()
或者 Number.parseFloat()
系列函数进行转换,如下。
const maxNumber = Number.MAX_SAFE_INTEGER; console.log(maxNumber); // 9007199254740991 const bigNumber = BigInt(maxNumber); console.log(bigNumber.toString()); // "9007199254740991" console.log(Number(bigNumber)); // TypeError: Cannot convert a BigInt value to a number console.log(Number.parseInt(bigNumber.toString())); // 9007199254740991
BigInt 在实际开发中的使用
BigInt 可以用于实现静态类型编程语言中的大整数运算,例如计算哈希函数,RSA 算法等等。同时,可以将 BigInt 用于跨语言数据的转换。BigInt 还可以用于实现复合度量单位和纳秒的时钟。 在实际开发中,我们需要一个 TypeScript 或者 Flow 投入生产环境,以充分体现 BigInt 的优点。
总结
BigInt 类型是 ECMAScript2017 标准中新增的类型,主要用于处理超过 Number 类型最大安全整数的数字计算,使用时需要注意 BigInt 的操作和转换。BigInt 可以用于实现哈希函数,RSA 算法等等。在实际开发中,我们建议使用 TypeScript 或者 Flow 投入生产环境,以充分体现 BigInt 类型的优点。
参考文献
- 阮一峰. BigInt 介绍[R]. 阮一峰. 2021.
- BigInt 类型:数值类型的额外附加类型. Mozilla. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt.
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cb4b275ad90b6d041fb8e6