bigint是唯一能安全表示64位有符号整数的javascript原始类型,需在json序列化时转字符串、反序列化时用bigint()构造,运算中禁止与number混用,并注意纳秒时间戳转换等细节。

JavaScript 的 BigInt 是唯一能安全表示 64 位有符号整数(即后端常见的 int64)的原始类型,它天然适配数据库或 RPC 接口中传输的 int64 值,但需注意序列化、反序列化与运算中的边界细节。
确保 JSON 传输中不丢失精度
标准 JSON.stringify() 不支持 BigInt,直接序列化会抛错。必须显式处理:
- 发送前:将
BigInt字段转为字符串(如id: userId.toString()),后端按字符串解析为int64 - 接收时:对已知应为
int64的字段(如"user_id"、"timestamp_ns"),用BigInt(str)构造(需确保字符串非空且只含数字/可选负号) - 避免用
JSON.parse(str, (k, v) => typeof v === 'string' && /^\-?\d+$/.test(v) ? BigInt(v) : v)全局转换——易误转 ID 字符串、手机号等
运算前统一类型,禁止隐式混合
BigInt 与 Number 不能混合参与算术运算(如 1n + 2 报错)。后端返回的 int64 必须全程以 BigInt 持有:
- 比较大小用
===或>/(<code>==会强制转换导致精度丢失) - 加减乘除均使用
n后缀字面量(如100n)或显式BigInt()转换操作数 - 位运算(
&、|、等)仅接受 <code>BigInt,适合处理标志位、分片 ID 等场景
与 Date 和时间戳协同处理
后端常用 int64 表示纳秒级时间戳(如 Protobuf 的 google.protobuf.Timestamp),JS 中需转换为毫秒再构造 Date:
- 纳秒 → 毫秒:
const ms = ns / 1000000n(整除,丢弃亚毫秒部分) - 构造日期:
new Date(Number(ms))(Number()安全,因毫秒值在Number.MAX_SAFE_INTEGER范围内) - 反向转换时,先用
Date.getTime()得毫秒,再* 1000000n得纳秒BigInt
序列化到 URL 或 localStorage 的兼容写法
BigInt.toString() 是安全的字符串表示,适用于所有文本上下文:
- URL 查询参数:
url?user_id=9223372036854775807(直接拼接字符串) - localStorage:
localStorage.setItem('lastId', id.toString()),读取后BigInt(localStorage.getItem('lastId')) - 不建议用
JSON.stringify({id})存储,除非已预设 replacer 处理BigInt
不复杂但容易忽略:只要坚持“进来的 int64 立即转 BigInt,出去的 BigInt 显式转字符串”,并在运算中杜绝与 Number 混用,就能实现真正无缝映射。











