如何理解 BigInt?
面试速答(30 秒版 TL;DR)
BigInt是 JS 的一种原始类型,用于表示 任意精度整数,解决number在大整数场景下的精度问题。- 字面量写法:
123n;构造:BigInt("123")或BigInt(123)。 BigInt不能表示小数;并且 不能和number混算(需要显式转换)。- JSON 不支持
BigInt,传输大整数一般用字符串。
为什么需要 BigInt:number 的安全整数上限
JS 的 number 虽然能表示很大的值,但只有到 2^53 - 1 以内的整数才是精确的:
Number.MAX_SAFE_INTEGER; // 9007199254740991
9007199254740991 + 1 === 9007199254740991 + 2; // true(精度丢失)
而 BigInt 可以精确表示更大的整数:
9007199254740991n + 1n === 9007199254740991n + 2n; // false(正常)
基本用法与规则
创建
123n;
BigInt("123");
BigInt(123); // 注意:参数是 number 时也必须是整数
不能混算(很常考)
1n + 1; // TypeError
1n + BigInt(1); // 2n
Number(1n) + 1; // 2
比较
1n === 1; // false(类型不同)
1n == 1; // true(会做宽松比较,面试不建议强调用法)
1n < 2; // true(关系比较允许,不会抛错)
JSON/接口传输怎么处理大整数?
JSON.stringify(1n)会抛错:TypeError: Do not know how to serialize a BigInt- 常用做法:后端把大整数当 字符串 下发,前端按需转
BigInt:
const id = BigInt("9223372036854775807");
如果业务还要参与计算,优先全链路统一用字符串或 BigInt,避免在边界处丢精度。
典型题 & 标准答法
Q1:BigInt 能表示小数吗?
不能。BigInt 只表示整数;需要高精度小数用十进制库(如 decimal.js)。
Q2:什么时候用 BigInt?
- 需要精确表达大整数:订单号、雪花 ID、数据库自增主键、时间戳纳秒级等。
- 需要精确整数运算:大数取模、位运算(但位运算在 JS number 上是 32 位,要注意差异)。
易错点/坑
BigInt(1.1)会抛错(必须是整数)。Math.*大多只支持number,不支持BigInt。- 不要把
BigInt直接塞进 JSON,接口层要做字符串约定。
速记要点(可背诵)
BigInt:任意精度整数,123n。- 不能和
number混算,必须显式转换。 - JSON 不支持 BigInt,大整数传输用字符串。