json.stringify深拷贝遇bigint报错,因json标准不支持;推荐用replacer函数转字符串或现代structuredclone;避免污染原型、吞错误、强转失精度。

直接用 JSON.stringify 做深拷贝时遇到 TypeError: Do not know how to serialize a BigInt,说明数据里混了 123n 这类值——JSON 标准不支持它,引擎不会跳过,而是立刻中断执行。解决核心是:**不让 BigInt 进入 JSON 序列化流程,或让它以安全形式参与**。
用 replacer 函数拦截转换(最常用)
这是兼容性好、逻辑清晰的首选方式。给 JSON.stringify 传一个函数作为第二个参数,在遍历每个值时判断类型:
- 遇到
typeof value === 'bigint',返回value.toString(),转成可序列化的字符串 - 其他值原样返回,不干扰结构
- 自动处理嵌套对象和数组,无需手动递归
示例:const copy = JSON.parse(JSON.stringify(obj, (k, v) => typeof v === 'bigint' ? v.toString() : v));
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
改用 structuredClone(现代环境推荐)
Node.js 18.13+ 或 Chrome 115+ 起,structuredClone() 已原生支持 BigInt、Map、Set、循环引用等,且不抛错:
- 一行调用:
const copy = structuredClone(obj); - 无需预处理,也不改变原始数据类型(
123n拷贝后仍是123n) - 注意:目前 Safari 和旧版 Node.js 不支持,需检查运行环境
提前清洗数据再拷贝(适合可控场景)
如果深拷贝前你能确定哪些字段可能是 BigInt(比如 Prisma/Drizzle 查询结果里的 id、count),可先做一次轻量预处理:
- 遍历对象,对已知 key 名(如
id、userId)或所有bigint值统一转字符串 - 再用
JSON.parse(JSON.stringify(...))或其他深拷贝工具 - 优点是逻辑外显,便于调试;缺点是需要维护字段约定
不建议的做法
有些方案看似省事,但埋下隐患:
- 往
BigInt.prototype加toJSON:TypeScript 报错、污染全局、与其他库可能冲突 - 用空
try...catch吞掉错误:报错消失,但数据可能已损坏(比如字符串 ID 后续被当数字计算) - 用
parseInt或+强转字符串为 Number:超出MAX_SAFE_INTEGER就丢精度,再转BigInt也救不回来










