indexeddb仅支持结构化克隆算法可处理的类型:字符串、数字、布尔值、普通对象、数组、date、arraybuffer、typedarray、dataview、map、set(新浏览器)及合法嵌套结构;禁止存储函数、promise、dom元素、symbol、weakmap、weakset、循环引用对象和error对象。

IndexedDB 中不能直接存储所有 JavaScript 类型,它对可存储的数据类型有明确限制和序列化要求。核心原则是:只有能被结构化克隆(structured clone)算法处理的对象才能存入 IndexedDB。
哪些类型可以安全存储
以下类型可直接使用 put() 或 add() 存入对象存储(Object Store),无需额外转换:
- 字符串(String)、数字(Number,含
NaN、Infinity)、布尔值(Boolean) - 普通对象(Object)、数组(Array)、Date 对象、RegExp(部分浏览器支持,但不推荐依赖)
- ArrayBuffer、TypedArray(如
Uint8Array)、DataView - Map 和 Set(需注意:仅在较新浏览器中完全支持,且键/值本身也需可克隆)
- 嵌套结构(如对象内含数组、数组内含 Date 等),只要每层都符合上述规则
明确禁止或不可靠的类型
以下类型无法被结构化克隆,写入时会抛出 DataCloneError 异常:
- 函数(Function)、Promise、Generator 对象
- DOM 元素(
<div>、<code>document、window等) - Symbol 类型(包括作为对象键的 Symbol)
- WeakMap、WeakSet(不可克隆,且设计上就不支持序列化)
- 带有循环引用的对象(例如
obj.a = obj) - error 对象(
Error、TypeError等) -
ArrayBuffer 可直接存;若需保存图片、音频等,建议先转为
ArrayBuffer或Blob(注意:Blob在部分旧版浏览器中不可直接存,应转为ArrayBuffer后再存) - 大文件建议分块存储(chunking),避免单次写入超时或内存溢出;读取时再拼接还原
- 不要将 base64 字符串直接存——它比原始二进制体积大 ~33%,且增加解析开销
- 主键(
keyPath指定字段或key参数)必须是 有效 key:即undefined、null、NaN、对象/数组(除非它们本身是合法 key,如数组只含可 key 类型且长度 > 0)都不允许 - 合法 key 类型包括:string、number、Date、Array(元素均为合法 key,且非空)、ArrayBuffer(仅在部分浏览器支持,不推荐用作 key)
- 自动递增主键(
autoIncrement: true)时,key 必须为 number,且不能显式提供 key 值
尝试存储这些类型会导致事务中止,必须提前过滤或转换。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
二进制数据与大文件处理
IndexedDB 原生支持二进制数据,但实际容量受浏览器配额限制(通常为硬盘可用空间的 50%~60%,单个 origin 下最低约 50MB~1GB,具体由 UA 动态分配):
键(key)的特殊约束
作为索引或主键使用的 key,除需可克隆外,还有额外规范:
违反 key 规则会在 add()/put() 时立即报 DataError 或 InvalidAccessError。
实际开发中,建议在写入前用轻量校验函数预检数据结构,尤其对用户输入或第三方 API 返回值;对复杂状态对象,可考虑用 JSON.stringify() + JSON.parse() 显式降级(牺牲部分类型信息,换取兼容性与确定性)。










