浅拷贝时间与空间复杂度均为O(n),仅复制顶层元素,对引用类型只拷贝地址;深拷贝因递归遍历嵌套结构,耗时可达浅拷贝的10–50倍,且未处理循环引用时会栈溢出或无限循环。

浅拷贝和深拷贝在处理对象集合(如数组含嵌套对象、对象含多个子对象等)时,时间与空间复杂度差异显著,核心取决于“是否递归”以及“数据结构的嵌套深度和宽度”。
浅拷贝:O(n) 时间,O(n) 空间,仅限第一层
浅拷贝只遍历集合的顶层元素,对每个元素做值复制或引用复制:
- 对基本类型(数字、字符串等):直接拷贝值,开销极小
- 对引用类型(对象、数组等):只拷贝其内存地址,不访问内部结构
- 无论集合含 10 个还是 10 万个对象,只要它们都是顶层项,耗时基本线性增长(实测万级数组通常
- 内存占用≈原集合大小 + 少量新容器开销(如新数组/对象头),无额外堆分配压力
深拷贝:O(n × d) 时间,O(n × d) 空间,d 为平均嵌套深度
深拷贝必须逐层展开所有引用类型,复杂度由数据“广度×深度”共同决定:
- n 是集合中所有可遍历节点总数(包括嵌套对象的属性、数组的每个元素及其子项)
- d 是最大嵌套层级(如
{a: {b: {c: {d: 1}}}}的 d=4),递归调用栈深度即为此值 - 遇到 Map、Set、Date、RegExp 等特殊类型时,还需额外类型判断与构造逻辑,进一步抬高常数因子
- 循环引用需额外哈希表记录已克隆对象,增加空间与查找开销
实际集合场景中的典型表现
以一个含 1000 个用户的数组为例:[{id:1,name:'A',profile:{age:25,city:'BJ'}}, ...]
立即学习“Java免费学习笔记(深入)”;
- 浅拷贝(
[...arr]或arr.slice()):≈0.05ms,新数组与原数组元素指向同一 profile 对象 - JSON 方式深拷贝:≈8–12ms,但 profile 中若有 Date 或函数会丢失或报错
-
structuredClone(arr):≈2–4ms,支持 profile 中的 Date/Map 等,且自动处理循环引用 - Lodash
cloneDeep:≈3–6ms,兼容性更广(含自定义类),但包体积大
关键判断依据:别看元素数量,要看“引用穿透层数”
真正拖慢深拷贝的不是集合长度,而是深层嵌套或大量交叉引用:
- 扁平结构(如
[{id:1},{id:2},…]):深拷贝与浅拷贝性能差距小(2–3 倍内) - 三层以上嵌套(如
items.map(x => ({...x, meta: {...x.meta, tags: [...x.meta.tags]}}))):深拷贝耗时可能达浅拷贝的 10–50 倍 - 含 100+ 个互相引用的对象图:浅拷贝仍快如闪电;深拷贝若未处理循环引用,直接栈溢出或无限循环


















