structuredClone 不限制嵌套深度,通过引擎底层图遍历算法处理任意层级嵌套,不会栈溢出;它支持可结构化数据(如Object、Array、Date、Map、循环引用等),不支持函数、Symbol、DOM节点等,遇不支持类型抛DataCloneError。

structuredClone 不限制嵌套深度,它通过引擎底层的图遍历算法处理任意层级的嵌套结构,不会因层数过深导致栈溢出,也不需要你手动设置“最大深度”。它的设计目标就是安全、完整地复制整个可结构化对象图,而不是做有限层拷贝。
它不设深度上限,但有类型边界
只要对象中所有值都属于 可结构化数据(structured data) 范畴,无论嵌套 5 层、50 层还是 500 层,structuredClone 都能正确处理:
- 支持:普通对象、数组、Date、RegExp、Map、Set、ArrayBuffer、TypedArray、BigInt、Error、循环引用等
- 不支持:函数、Promise、Symbol(除 Symbol.for 创建的)、undefined、WeakMap、WeakSet、DOM 节点、getter/setter 定义
一旦遇到不支持的类型(如对象里有个方法),会立即抛出 DataCloneError,错误明确,便于定位问题。
为什么不会栈溢出?和手写递归有本质区别
structuredClone 不是 JS 层的递归函数,而是由 V8/SpiderMonkey 等引擎用 C++ 实现的结构化克隆算法。它内部维护一个“已访问对象映射表”,采用图遍历(graph traversal)而非深度优先递归:
立即学习“Java免费学习笔记(深入)”;
- 遇到重复引用(包括深层嵌套中的循环或共享子对象),直接复用已生成的克隆节点
- 跳过字符串序列化中间态,全程在内存地址层面操作
- 时间复杂度接近 O(n),空间开销与对象总大小正相关,与嵌套深度无关
实际嵌套场景验证
比如这个 10 层嵌套且含自引用的对象:
const deep = { a: 1 };
let ref = deep;
for (let i = 0; i < 10; i++) {
ref = ref.next = { level: i + 1 };
}
ref.self = deep; // 形成循环
执行 structuredClone(deep) 后,新对象仍保持相同嵌套结构和循环关系,且原始对象与克隆体完全隔离——修改任一副本的 next 属性,另一方不受影响。
需要控制深度?那它不是你的工具
structuredClone 的定位是保真、完整、安全的深拷贝,不是“可控深度拷贝器”。如果你明确只需要拷贝前 3 层、跳过函数、忽略原型或过滤某些字段,它无法满足——此时应自行实现带 depth 参数的递归函数,或使用 Lodash 的 _.cloneDeepWith 等定制方案。


















