javascript处理超大整数需用bigint,它是独立原始类型;创建用字面量(如123n)或字符串构造函数;不与number混算,除法向零截断,比较推荐===;json交互需字符串中转,不可用于math、date等。

JavaScript 中处理超大整数,核心就是用 BigInt——它不是“升级版 Number”,而是专为任意精度整数设计的独立原始类型。只要数字超过 9007199254740991(即 Number.MAX_SAFE_INTEGER),就该考虑 BigInt,否则运算结果可能出错却毫无提示。
怎么创建一个 BigInt
两种可靠方式,推荐优先用字面量:
-
字面量写法:在整数末尾加
n,比如123456789012345678901234567890n、0n、-999n。这是最安全、最直观的方式,不会因 Number 先解析而失真。 -
构造函数写法:用
BigInt("12345678901234567890"),参数必须是字符串或 BigInt 类型。注意:BigInt(123)虽然合法,但BigInt(9007199254740992)会出错——因为传入的 Number 已经不精确了;小数如BigInt(1.5)直接抛 TypeError。
运算规则和常见陷阱
BigInt 支持整数能做的大多数事,但边界很明确:
- 支持
+、-、*、**(幂)、%(取模)和所有位运算(&、|、等)。 -
绝不允许和 Number 混合运算:写
100n + 1或5n * 3会立即报TypeError。这是硬性限制,不是警告。 - 除法
/的结果仍是 BigInt,且向零截断(不是四舍五入),例如7n / 2n得3n,没有小数部分。 - 比较时:
==会隐式转换并返回合理结果(如5n == 5是true),但===严格区分类型(5n === 5是false),建议统一用===避免混淆。
前后端交互与实际落地要点
超大 ID(如 Snowflake、数据库主键)是最常见的使用场景,但容易在传输环节翻车:
- 后端返回的长数字,如果走 JSON,默认被前端解析成 Number,精度已丢失。正确做法是后端将 ID 以字符串形式下发,前端再用
BigInt(idStr)构造。 - JSON 不支持 BigInt:
JSON.stringify({ id: 123n })会报错或忽略字段。序列化前需手动转字符串:JSON.stringify({ id: bigId.toString() });反序列化时再用BigInt(str)恢复。 - 避免在循环中反复调用
BigInt()。若常量固定(如1000000n),直接定义为字面量复用;若来自输入,尽量提前转换、缓存。
哪些地方不能用 BigInt
它能力明确,但不万能:
- 不能用于
Math方法(Math.max、Math.sqrt等全部不接受)。 - 不能传给
Date构造函数(时间戳需是 Number)。 - 不支持小数、科学计数法(
1.23n、1e10n均语法错误)。 -
Array.prototype.sort()默认比较函数对 BigInt 行为不稳定,建议显式写比较逻辑:(a, b) => a b ? 1 : 0。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











