跳到主要内容

如何理解 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,大整数传输用字符串。