在编程中,我们经常需要处理大整数,但是 JavaScript 中的 Number 类型最多只能表示到 2 的 53 次方,也就是 9007199254740992,对于超过这个范围的大整数就会出现精度丢失的问题。在 ES11 中,新增了BigInt类型,用于处理超出Number类型范围的大整数,本文将详细介绍BigInt类型的使用和相关注意事项。
定义 BigInt
在ES11中,BigInt类型用于表示任意大小的整数,它是一种新的原始数据类型,使用方式与其它JavaScript原始数据类型类似。使用BigInt类型需要在数字后面加一个n,例如:
const maxBigInt = 9007199254740991n; const bigInt = 123456789012345678901234567890n;
我们还可以通过调用BigInt()函数将其他数据类型转换为BigInt类型:
const bigIntFromNumber = BigInt(123); // 123n const bigIntFromNumberString = BigInt("123"); // 123n
运算符支持
BigInt类型的运算符跟Number基本相同,但是有些运算符不能混用BigInt和Number类型进行运算,会导致类型错误。
支持的运算符包括:
- +:加法
- -:减法
- *:乘法
- **:幂运算
- /:除法
- %:求余数
- <<:左移
:右移
:无符号右移
- &:按位与
- |:按位或
- ^:按位异或
无法混用的运算符有以下几种:
- 其他数值类型与BigInt类型进行算数运算时会报TypeError异常
- 值相等判断运算符(==和!=)不能用于BigInt类型
- 大小比较运算符(>、<、>=、<=)也不能用于 BigInt 类型,因为这些运算符只支持数值类型。
应用示例
判断是否为偶数
BigInt类型的求余数运算%可以用来判断一个数是否为偶数。
function isEven(n) { return n % 2n === 0n; } console.log(isEven(6n)); // true console.log(isEven(7n)); // false
阶乘计算
计算阶乘时,如果使用Number类型,多数情况下结果会出现精度丢失的问题。使用BigInt类型可以很好地解决该问题。
-- -------------------- ---- ------- -------- ------------ - -- -- - -- - ------ ----- - -- -- -- -- - ------ --- - --- --- - --- --- ---- - - --- - -- -- ---- - --- -- -- - ------ ---- - ---------------------------- -- --------------------
斐波那契数列
斐波那契数列的实现可以使用循环或者递归两种方式。使用BigInt类型可以解决数值过大导致的精度丢失问题。
使用循环的方式实现斐波那契数列:
-- -------------------- ---- ------- -------- ------------ - -- -- -- -- - ------ --- - -- -- --- -- - ------ --- - --- ---- - --- --- ---- - --- --- ---- - - --- - -- -- ---- - ----- ---- - ---- - ----- ---- - ----- ---- - ----- - ------ ----- - -----------------------------
使用递归的方式实现斐波那契数列:
-- -------------------- ---- ------- -------- ------------ - -- -- -- -- - ------ --- - -- -- --- -- - ------ --- - ------ ----------- - --- - ----------- - ---- - -----------------------------
注意事项
- 在用BigInt类型进行计算运算时,要使用BigInt类型的运算符,否则会报类型错误。
- BigInt类型的变量不能与Number类型混用,否则会导致类型错误。
- 在一些旧版的浏览器以及node.js的旧版中不支持BigInt类型,因此在使用BigInt类型时,需要先检查浏览器或node.js的版本是否支持。
- BigInt类型的变量和常量不能用于位运算。
- BigInt类型的变量不能用于模板字面量中。
总结
ES11中新增了BigInt类型,它用于处理超过Number类型范围的大整数。BigInt类型的使用方式类似于其它JavaScript原始数据类型,BigInt类型支持大部分的算数运算符,但不支持一些混用Number类型的运算符,同时也不能与Number类型混用。BigInt类型的应用具有广泛的现实意义,可以解决大数计算时的精度丢失问题。在实际应用中,需要注意一些使用限制,如不能用于模板字面量、不能与旧版浏览器或node.js混用等。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a91eda48841e9894569f28