JavaScript中BigInt无法被JSON.stringify直接序列化,会抛出TypeError;需通过replacer函数转为字符串,或配对使用reviver还原,也可封装安全工具函数处理。

JavaScript中BigInt类型无法直接被JSON.stringify序列化,会抛出TypeError错误。这是因为JSON标准本身不支持任意精度整数,而BigInt是ES2020引入的独立数值类型,不在JSON规范范围内。解决的关键在于**序列化前手动转换BigInt为可序列化的格式(如字符串或数字),并在反序列化时还原**。
方案一:使用replacer函数将BigInt转为字符串
这是最常用、兼容性好且语义清晰的方式。通过JSON.stringify的第二个参数replacer,遍历对象并把所有BigInt值替换为字符串形式:
- BigInt值转成字符串后能完整保留精度,不会丢失信息
- 字符串格式易于识别(如"123456789012345678901234567890n"或仅"123456789012345678901234567890")
- 示例代码:
const obj = { id: 1n, count: 9007199254740991n };
const json = JSON.stringify(obj, (key, value) =>
typeof value === 'bigint' ? value.toString() : value);
// 输出:{"id":"1","count":"9007199254740991"}
方案二:自定义序列化/反序列化配对函数
若需在传输后准确还原BigInt,应配套实现解析逻辑,避免接收方误将字符串当普通数字处理:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 序列化仍用replacer转字符串,但约定字段名或加标识(如以_big结尾)
- 反序列化时用JSON.parse的reviver参数,检测特定模式并调用BigInt()构造
- 注意:BigInt()只接受字符串或整数,不能传浮点字符串或空字符串
const revived = JSON.parse(json, (key, value) =>
key.endsWith('_big') && typeof value === 'string'
? BigInt(value)
: value);
方案三:扩展全局JSON(谨慎使用)
可临时覆盖JSON.stringify和JSON.parse行为,让其自动支持BigInt。但存在风险:
立即学习“Java免费学习笔记(深入)”;
- 影响全局环境,可能与第三方库冲突
- 需确保所有用到JSON的地方都预期此行为
- 更推荐封装为工具函数(如safeStringify / safeParse),而非污染原生对象
注意事项与边界情况
实际使用中需留意以下细节:
- BigInt不能与Number混用运算(如1n + 1会报错),序列化前确保数据结构干净
- 小于-(2^53-1)或大于2^53-1的Number转BigInt虽可行,但原始Number已丢失精度
- JSON不支持undefined、function、Symbol、Date等,BigInt只是其中之一;统一处理时可一并纳入replacer
- 服务端若为Node.js,需确认运行版本≥v10.4.0(BigInt支持起点),且解析时用BigInt()而非+value

















