structuredClone 无法处理循环引用对象,会直接抛出 TypeError 错误;因其基于 structured clone algorithm,要求纯数据流序列化,不维护引用映射表,故不支持循环结构,替代方案包括 lodash.cloneDeep 或手写带 WeakMap 缓存的深拷贝函数。

structuredClone 无法处理循环引用对象,会直接抛出错误。
structuredClone 对循环引用的限制
structuredClone 是基于 structured clone algorithm 实现的深拷贝方法,该算法明确不支持对象中存在循环引用(即某个对象属性间接或直接指向自身)。一旦检测到循环引用,浏览器会立即抛出 TypeError: Converting circular structure to JSON 类似的错误(实际错误信息可能略有差异,如 TypeError: cyclic object value)。
这与 JSON.stringify 的行为类似——两者都依赖相同的底层序列化机制,因此都拒绝循环结构。
为什么不能支持循环引用?
structured clone 算法设计目标是安全、可预测地跨 Realm(如 iframe、Worker)传递数据,要求序列化结果必须是纯数据流。循环引用会破坏线性序列化的前提,无法生成确定性的字节序列,也难以在反序列化时无歧义地重建引用关系。
立即学习“Java免费学习笔记(深入)”;
- 它不维护对象图中的引用映射表(不像某些手动实现的深拷贝库)
- 不支持自定义 reviver/replacer 或克隆钩子
- 不处理 WeakMap、WeakSet、函数、DOM 节点等非可序列化值(循环引用只是其中一类限制)
替代方案:需要循环引用时怎么办?
如果业务逻辑确实依赖循环引用对象(例如树形结构带 parent 指针、图结构、双向绑定模型),structuredClone 不适用,需换用其他方式:
- 使用第三方库如
lodash.cloneDeep(内部用 Map 记录已遍历对象,支持循环) - 手写带记忆缓存的深拷贝函数(用 WeakMap 缓存源对象 → 目标对象映射)
- 重构数据结构,避免运行时循环(例如用 ID 关联代替直接引用)
- 对特定场景做预处理:临时解构循环关系 → clone → 重新建立引用
快速验证示例
你可以用这段代码测试:
const obj = {}; obj.self = obj;<br>try {<br> structuredClone(obj);<br>} catch (e) {<br> console.error(e.message); // 会触发错误<br>}
执行后控制台将明确报错,证实其不支持该场景。


















