安全操作 BigInt 的关键是避免精度丢失、类型混用和隐式转换:创建时优先用字符串传参或字面量(如"9007199254740991123456"或9007199254740991123456n),运算前确保类型一致,比较用===并统一类型,序列化需自定义replacer和reviver。

安全操作 BigInt 的关键在于避免精度丢失、类型混用和隐式转换。直接用数字字面量创建大 BigInt 容易出错,推荐统一用字符串传参;所有跨类型运算必须显式转换;比较和序列化也要按规则处理。
创建时优先用字符串传参
BigInt 构造函数接受 Number 或字符串,但传入超大 Number 会先被 JS 解析为浮点数,导致精度提前丢失。例如 BigInt(9007199254740991123456) 实际传入的是已失真的浮点近似值。
- ✅ 正确:用字符串,BigInt("9007199254740991123456")
- ✅ 正确:字面量写法,9007199254740991123456n(仅限纯数字无科学计数法)
- ❌ 避免:BigInt(Number.MAX_SAFE_INTEGER + 100000) —— 加法已在 Number 范围内溢出
运算前确保类型一致
BigInt 和 Number 不能直接参与算术运算,JS 会立即抛出 TypeError: Cannot mix BigInt and other types。这不是可选建议,而是强制约束。
- 加减乘除幂等运算,两个操作数必须同为 BigInt 或同为 Number
- 需要混合时,显式转换:10n + BigInt(20) 或 Number(10n) + 20(后者有精度风险)
- 位运算(& | ^ >)同样只支持 BigInt 与 BigInt
比较和序列化要特别注意
宽松相等(==)会让 BigInt 与 Number 互相转换后比较,结果可能误导;JSON.stringify() 默认忽略 BigInt,直接调用会报错。
立即学习“Java免费学习笔记(深入)”;
- 比较推荐用 ===,并确保两边类型一致:123n === BigInt("123")
- 序列化需自定义 replacer:JSON.stringify(obj, (k, v) => typeof v === 'bigint' ? v.toString() : v)
- 反序列化时配合 reviver:JSON.parse(jsonStr, (k, v) => /^\d+n$/.test(v) ? BigInt(v.slice(0, -1)) : v)
适用场景与性能提醒
BigInt 不是 Number 的替代品,而是专用于高精度整数场景的补充类型。
- 典型用途:Snowflake ID、区块链交易哈希、加密密钥、纳秒级时间戳、天文/金融大整数计算
- 不适用:普通计数器、UI 动画、循环索引——Number 更快更轻量
- 性能提示:BigInt 运算比 Number 慢,内存占用更高,仅在必要时启用


















