JSON.stringify()深拷贝BigInt会报错,因JSON标准不支持;可用replacer转为字符串(如"1n")并手动还原,或用structuredClone(现代浏览器/Node.js 18.11+支持)、flatted等第三方库安全处理。

JavaScript 中用 JSON.stringify() 做深拷贝时,遇到 BigInt 会直接报错:TypeError: Do not know how to serialize a BigInt。这是因为 JSON 标准本身不支持 BigInt,原生序列化无法处理。
用自定义 replacer 函数绕过 BigInt
在 JSON.stringify() 中传入第二个参数 replacer,把 BigInt 转成字符串(或 Number,但要注意精度丢失风险):
- 推荐转为字符串,保留完整精度:
value => typeof value === 'bigint' ? value.toString() : value - 反序列化时需手动还原:解析后遍历对象,识别形如
"123n"的字符串并用BigInt()转回(注意只对明确标记的字段操作,避免误转) - 示例:
const obj = { id: 1n, name: 'test', count: 42 }; const json = JSON.stringify(obj, (key, value) => typeof value === 'bigint' ? value.toString() + 'n' : value ); // → '{"id":"1n","name":"test","count":42}' const parsed = JSON.parse(json); const restored = { ...parsed, id: BigInt(parsed.id.slice(0, -1)) }; // 手动还原
用 structuredClone(现代浏览器首选)
structuredClone() 是浏览器原生支持的深拷贝 API,从 Chrome 98、Firefox 94、Safari 16.4 起已支持,它原生支持 BigInt、Map、Set、Date、RegExp 等类型,无需额外处理:
- 直接调用:
const copy = structuredClone(originalObj); - 兼容性注意:Node.js 17+ 默认启用,但需开启
--experimental-structured-cloning;Node.js 18.11+ 和 20+ 已稳定支持 - 不支持函数、undefined、Symbol、循环引用(同 JSON)
用第三方库(如 lodash.cloneDeep 或 flatted)
如果需要兼容老旧环境或更灵活控制:
-
lodash.cloneDeep:默认不处理BigInt,但可通过自定义customizer拦截并转换 -
flatted(比 JSON 更强的序列化库):支持BigInt、Map、Set等,且体积小,适合替代 JSON 流程 - 示例(flatted):
import { stringify, parse } from 'flatted'; const obj = { x: 9007199254740991n, arr: [1n, 2n] }; const str = stringify(obj); // ✅ 成功 const copy = parse(str); // ✅ 还原为 BigInt
不推荐:强行 toString() 后 eval 或 Function
有人尝试把 BigInt 转成 "123n" 字符串再用 eval 或 Function 还原,这存在严重安全风险(执行任意代码)且不可靠,生产环境务必避免。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











