JSON序列化BigInt报错是因为标准不支持该类型,需用replacer函数将其转为字符串;safeReplacer精准识别bigint并调用toString(),兼顾精度与兼容性,但反序列化后需手动还原。

JSON序列化遇到 BigInt 会直接报错,是因为 JSON 标准(RFC 7159)根本不支持 BigInt 类型。它只定义了六种可序列化的值:字符串、数字、布尔值、null、数组和对象。而 BigInt 是 JavaScript 后来引入的独立原始类型,语义上与 Number 不同——它表示任意精度整数,底层存储方式也完全不同。引擎无法安全地把它映射成 JSON 中的 "number"(因为那等价于 IEEE 754 双精度浮点数,最大安全整数只有 2^53 - 1),所以选择明确报错,而不是静默丢数据或错误转换。
这就导致:只要 JSON.stringify() 遍历到一个 123n,就会立刻抛出 TypeError: Do not know how to serialize a BigInt,整个深拷贝流程中断。
关键不是“怎么绕过”,而是“怎么让 BigInt 主动参与序列化”。replacer 函数正是为此设计的钩子。
重写 replacer 函数的核心逻辑
replacer 是 JSON.stringify(obj, replacer) 的第二个参数,当为函数时,它会在每个键值对被处理前调用,接收 (key, value),返回值将替代原 value 进入后续序列化。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
要修复 BigInt 报错,只需在函数中识别并安全转换:
- 用
typeof value === 'bigint'精准判断(不能用instanceof,BigInt 是原始类型) - 返回
value.toString()—— 这是唯一不丢精度的方式(转Number会溢出,比如9007199254740992n转成Number就不可靠) - 其他所有类型原样返回,不干扰结构、Date、undefined、null、Symbol 等行为
一个稳妥可用的 replacer 写法
const safeReplacer = (key, value) => {
if (typeof value === 'bigint') return value.toString();
return value;
};配合深拷贝使用:
const copy = JSON.parse(JSON.stringify(originalObj, safeReplacer));
这个 replacer 能处理哪些情况
-
顶层属性:
{ id: 123n }→"id":"123" -
嵌套对象:
{ user: { id: 456n } }→"user":{"id":"456"} -
数组元素:
[1n, 2n, { count: 3n }]→["1","2",{"count":"3"}] -
混合类型:
{ id: 123n, name: "Alice", active: true }→ 正常保留字符串、布尔等
注意事项
- 序列化后
BigInt变成字符串,反序列化回来仍是字符串,如需还原,必须手动调用BigInt(json.id) - 不要在
replacer中返回undefined(该字段会被剔除)、NaN或Infinity(JSON 不支持) - 不要修改
BigInt.prototype.toJSON—— TypeScript 报错、污染全局、与其他库冲突风险高 - 如果项目需要自动还原,可配对使用
JSON.parse(json, reviver),但需约定字段名或加标记(如_big后缀),避免误转普通数字字符串
不复杂但容易忽略。

















