浅谈js新增基本类型BigInt

浅谈js新增基本类型BigInt

ES2020新增 一个基本类型BigInt,表示任意精度格式的整数,无符号整数类型,存储任意长度的整数。



前言

BigInt是JavaScript中引入的一种新的基本数据类型,主要用于表示任意精度格式的整数。它可以安全地存储和操作大整数,即使这个数已经超出了Number类型能够表示的安全整数范围。

在 JavaScript 中,普通的数字(Number 类型)是基于 IEEE 754 双精度浮点数格式存储的,这导致它们只能安全地表示 -9007199254740991(即 -(2^53 - 1))到 9007199254740991(即 2^53 - 1)之间的整数。超出这个范围的整数在表示时可能会失去精度。因此,BigInt解决了之前Number整数溢出的问题。

它允许你表示和操作大于 2^53 - 1 的整数,而且不会丢失精度。BigInt 是一种内置对象,不是一种特殊的数字字面量语法。你可以使用 BigInt() 函数将一个整数或字符串转换成 BigInt,或者在数字字面量后面添加 n 后缀来创建 BigInt。


一、BigInt特性

1.无符号与任意长度

BigInt是一种无符号整数类型,可以存储任意长度的整数。它通常使用64位或128位来表示,但实际上并不受限于特定的位数。这使得BigInt能够存储比普通整数类型大得多的数字,例如超过10的100次方的数字。

2.运算支持

BigInt支持常见的数学运算,包括加法、减法、乘法和除法等。这些运算可以在BigInt值之间进行(这是重点,不同类型运算,会损失精度),而不会导致精度损失或溢出。

3.类型转换

当需要将BigInt与普通数字(Number类型)进行交互时,需要进行显式的类型转换。这是因为BigInt和普通数字是两种不同类型的值,不能直接混合使用。

4.应用场景广泛

由于BigInt能够处理大整数,它在计算机科学中的应用非常广泛。例如,在密码学中,它可以用于生成加密密钥;在大数据分析中,它可以用于处理大量的数据;在自然数值域、金额和货币、计数器、标识符以及时间戳等场景中,BigInt也都有着重要的应用,也为前端技术应用的边界做出了延伸贡献。

二、BigInt的使用

1.创建 BigInt

代码如下(示例):

const bigInt1 = BigInt("12345678901234567890"); // 使用字符串创建 BigInt  
const bigInt2 = 12345678901234567890n; // 使用数字字面量后缀 n 创建 BigInt

2.BigInt 运算

BigInt 支持加(+)、减(-)、乘(*)、除(/)、取模(%)等基本运算,也支持位运算(如按位与 &、按位或 |、按位异或 ^ 等):

const sum = BigInt(12345678901234567890) + BigInt(98765432109876543210);  
//console.log(sum)   111111111011111110656n
const diff = BigInt(12345678901234567890) - BigInt(98765432109876543210);  
//console.log(diff)  -86419753208641976320n
const product = BigInt(12345678901234567890) * BigInt(98765432109876543210);
//console.log(product) 1219326311370217884360920552323609001984n

对于除法运算,需要注意的是,BigInt 的除法运算会返回一个 BigInt 类型的商,任何小数部分都会被舍弃。如果需要获取余数,你可以使用 % 运算符。:

const sum = BigInt(12345678901234567890) + BigInt(98765432109876543210);  
//console.log(sum)   111111111011111110656n
const diff = BigInt(12345678901234567890) - BigInt(98765432109876543210);  
//console.log(diff)  -86419753208641976320n
const product = BigInt(12345678901234567890) * BigInt(98765432109876543210);
//console.log(product) 1219326311370217884360920552323609001984n

3.与普通数字的交互

BigInt 和普通数字(Number 类型)是两种不同类型的值,因此不能直接进行混合运算。如果尝试这样做,JavaScript 会抛出一个错误。你可以使用 BigInt() 或字面量后缀 n 来显式转换类型:

const regularNumber = 123;  
const bigNumber = BigInt(123);  
  
// 错误的用法,会抛出 TypeError  
// const result = regularNumber + bigNumber;  
//Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions at <anonymous>:1:30
  
// 正确的用法,显式转换类型  
const result = BigInt(regularNumber) + bigNumber;
//console.log(result)
// 246n

4.比较操作

你可以使用比较运算符(如 >、<、==、!=、>=、<=)来比较 BigInt 值。不过,与普通数字进行比较时,至少保证一个数字是BigInt 类型:

const bigInt1 = BigInt(123);  
const bigInt2 = BigInt(456);  
const regularNumber = 789;  
  
console.log(bigInt1 < bigInt2); // true  
console.log(bigInt1 < BigInt(regularNumber)); // true  
 console.log(bigInt1 < regularNumber); // true,这里理论上应该报错,实际不会报错,因为是js机制的隐式转换,只限于比较

bigInt1 < regularNumber,这里理论上应该报错,实际不会报错,因为js机制的隐式转换(这里就不赘述了,已有太多资料可以查询),只限于比较,小伙伴可以试验下,亲试如此。


总结

1、BigInt 类型的值不能和普通数字混合使用,除非进行显式的类型转换(比较是例外)。
2、BigInt 不支持一些 Number 类型的方法,如 Math 对象中的大多数函数。你需要寻找适合 BigInt 的替代方案。
3、并非所有环境都支持 BigInt。确保你的代码运行在支持 BigInt 的 JavaScript 引擎中。
4、BigInt 的引入使得 JavaScript 在处理大整数时更加灵活和强大,特别是在需要精确表示和计算大整数的场景中,如加密、科学计算等。

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值