一文详细聊聊js新增基本类型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机制的隐式转换(这里就不赘述了,已有太多资料可以查询),只限于比较,小伙伴可以试验下,亲试如此。
补充:使用BigInt时的注意点
使用大数时需要注意:
- BigInt类型不能和内置函数Math共同使用
- BigInt不能和number类型进行运算, 只能和同为BigInt的数字进行运算
- BigInt可以和number进行比较
- BigInt不能转小数, 只能转整数, 遇到不是数字的情况(布尔值或者[] )内部应该会尝试先将其转为数字
验证例子1: n1为bigint, n2为数字, 使用Math.pow()函数来求两者的平方
const n1 = 10n; try { console.log(Math.pow(n1, 2)); } catch (error) { console.log(error); } const n2 = 10; console.log(Math.pow(n2, 2));
可以看到确实大数不能和math相关函数配合使用
验证例子2: 使用大数和number进行运算和比较
const n1 = 10n; const n2 = 20; try { console.log(n1 + n2); } catch (error) { console.log(error); } console.log(n1 + BigInt(n2)); console.log(n1 > n2);
结果大数不能和number进行运算, 可以和number进行比较
验证例子3: BigInt不能转小数
try { console.log(BigInt(22.22)); } catch (error) { console.log(error); }
报错内容大概是不能转换成bigint因为他不是个整数
总结
1、BigInt 类型的值不能和普通数字混合使用,除非进行显式的类型转换(比较是例外)。
2、BigInt 不支持一些 Number 类型的方法,如 Math 对象中的大多数函数。你需要寻找适合 BigInt 的替代方案。
3、并非所有环境都支持 BigInt。确保你的代码运行在支持 BigInt 的 JavaScript 引擎中。
4、BigInt 的引入使得 JavaScript 在处理大整数时更加灵活和强大,特别是在需要精确表示和计算大整数的场景中,如加密、科学计算等。
到此这篇关于js新增基本类型BigInt的文章就介绍到这了,更多相关js新增基本类型BigInt内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!