JavaScript中的BigInt类型使用指南
在JavaScript的日常开发中,我们经常会处理数值相关的操作,但普通的数字类型(Number)存在精度限制:Number类型采用IEEE 754双精度浮点数格式,只能安全表示-(2^53 - 1)到2^53 - 1之间的整数,超出这个范围的整数运算就会出现精度丢失的问题。BigInt类型就是为了解决这个问题而诞生的,它可以表示任意大小的整数,完美弥补了Number类型在整数范围上的不足。
BigInt的基本概念
BigInt是JavaScript的第七种原始数据类型,专门用来表示大于2^53 - 1的整数,或者需要保证整数运算精度的场景。它的数值后面会带一个n后缀,用来和普通的Number类型做区分。
BigInt的创建方式
创建BigInt有两种常见的方式,分别是直接在整数后面加n后缀,或者使用BigInt()构造函数。
// 方式1:整数后加n后缀创建BigInt
const bigInt1 = 12345678901234567890n;
console.log(bigInt1); // 输出 12345678901234567890n
console.log(typeof bigInt1); // 输出 "bigint"
// 方式2:使用BigInt()构造函数创建
// 参数可以是整数、字符串形式的整数,不能是小数或者非数字字符串
const bigInt2 = BigInt(9876543210987654321);
console.log(bigInt2); // 输出 9876543210987654321n
const bigInt3 = BigInt("12345678901234567890");
console.log(bigInt3); // 输出 12345678901234567890n
// 错误示例:传入小数会报错
// const errorBigInt = BigInt(123.45); // 抛出RangeError
// const errorBigInt2 = BigInt("123.45"); // 抛出SyntaxErrorBigInt的基本运算
BigInt支持大部分常见的算术运算符,包括加、减、乘、除、取模、幂运算等,但要注意BigInt和Number类型不能直接混合运算,需要先做类型转换。
const a = 100n; const b = 20n; // 加法运算 console.log(a + b); // 输出 120n // 减法运算 console.log(a - b); // 输出 80n // 乘法运算 console.log(a * b); // 输出 2000n // 除法运算:BigInt的除法会自动向下取整,不会保留小数部分 console.log(a / b); // 输出 5n,而不是5.0 // 取模运算 console.log(a % b); // 输出 0n // 幂运算 console.log(a ** 3n); // 输出 1000000n // 混合运算会报错,需要转换类型 // console.log(a + 10); // 抛出TypeError // 正确做法:转换为同一类型 console.log(Number(a) + 10); // 输出 110 console.log(a + BigInt(10)); // 输出 110n
BigInt的比较和逻辑操作
BigInt可以和Number类型比较大小,也支持常见的比较运算符和逻辑运算符,比较时会按照数值的实际大小进行判断。
const bigNum = 100n; const normalNum = 100; // 相等比较:== 会做类型转换,=== 不会 console.log(bigNum == normalNum); // 输出 true,值相等 console.log(bigNum === normalNum); // 输出 false,类型不同 // 大小比较 console.log(bigNum > 50); // 输出 true console.log(bigNum < 200n); // 输出 true // 逻辑运算 console.log(!!bigNum); // 输出 true,非零BigInt转为布尔值为true console.log(!!0n); // 输出 false,0n转为布尔值为false
BigInt的使用注意事项
- BigInt和Number类型不能直接混合运算,必须先转换为同一类型,否则会抛出类型错误。
- BigInt不支持一元正号运算符
+,比如+100n会报错,因为正号运算符会尝试将值转换为Number类型。 - Math对象上的方法都不支持BigInt,比如
Math.max(100n, 200n)会报错,需要自己实现对应的逻辑。 - 当BigInt转换为字符串时,会去掉后面的
n后缀,比如String(123n)的结果是"123"。 - JSON默认不支持BigInt类型,直接对包含BigInt的对象做JSON.stringify会报错,需要自定义序列化逻辑。
// 一元正号报错示例
// const error = +100n; // 抛出TypeError
// JSON序列化报错示例
const obj = { id: 12345678901234567890n };
// console.log(JSON.stringify(obj)); // 抛出TypeError
// 自定义序列化解决
const jsonStr = JSON.stringify(obj, (key, value) => {
if (typeof value === "bigint") {
return value.toString();
}
return value;
});
console.log(jsonStr); // 输出 {"id":"12345678901234567890"}适用场景
BigInt适合用在需要处理大整数的场景,比如金融领域的金额计算(避免精度丢失)、加密算法中的大数运算、数据库中的自增ID超过Number安全范围的情况等。如果处理的数值在安全整数范围内,且不需要保证整数精度,还是优先使用Number类型,因为它的运算性能更好,生态支持也更完善。