bigint无法被json.stringify序列化会直接抛出typeerror错误,因json标准不支持该类型;解决需用replacer函数转字符串、提前过滤或改用structuredclone()等原生支持方案。

当你用 JSON.stringify 对含 BigInt 的对象做深拷贝时,会直接抛出 TypeError: Do not know how to serialize a BigInt。这不是静默丢失,而是明确中断执行的原始异常,必须捕获或提前规避。
为什么 BigInt 会触发报错
JSON 标准本身不支持 BigInt 类型(它只定义了 number,且等价于 IEEE 754 双精度浮点数)。JSON.stringify 在遇到无法表示的值时,不会跳过或转成 null,而是立即 throw 错误——这和 undefined、function、Symbol 的“静默忽略”行为完全不同。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
例如:
const obj = { id: 123n };JSON.stringify(obj); // ⚠️ 抛出 TypeError
快速识别该错误的方法
- 在控制台或 Node.js 环境中运行时,错误堆栈中明确包含 "Do not know how to serialize a BigInt" 字样
- 使用
try...catch捕获时,error.name === 'TypeError'且error.message.includes('BigInt') - 若项目已接入错误监控(如 Sentry),该异常通常被归类为高频可定位的序列化失败类型
三种实用应对策略
-
提前过滤:深拷贝前遍历对象,将
typeof value === 'bigint'的字段转为字符串(value.toString())或安全数字(需确认是否超Number.MAX_SAFE_INTEGER) -
替换 replacer 函数:传入
JSON.stringify(obj, (key, val) => typeof val === 'bigint' ? val.toString() : val),避免中断,但注意返回的是字符串而非BigInt -
换用现代 API:Node.js 18.13+ / Chrome 115+ 支持
structuredClone(),它原生支持BigInt、Map、Set、Date等,且能处理循环引用(不抛错)
不推荐的“兜底”写法
不要用 JSON.stringify(obj) || '{}' 或未校验的 try...catch 吞掉错误——这会让 BigInt 问题隐身,后续逻辑可能因数据类型错乱而产生更隐蔽的 bug(比如字符串 ID 被误当数字参与计算)。










