核心判断标准是修改拷贝后对象是否影响原对象:不影响为深拷贝,影响则为浅拷贝;浅拷贝仅复制第一层,嵌套引用共享内存;深拷贝递归复制所有层级并创建独立副本。

核心判断标准只有一条:修改拷贝后的对象,是否会影响原始对象。不影响,就是深拷贝;影响了,就是浅拷贝。
看第一层还是看所有层级
浅拷贝只处理对象的顶层属性。基本类型(如 number、string)值被真正复制;引用类型(如嵌套对象、数组)只是把地址复制过去,新旧对象仍共用同一块内存。
深拷贝会递归进入每一层,对所有嵌套的引用类型都新建内存空间,确保整个结构完全独立。
-
浅拷贝示例:用
Object.assign({}, obj)或展开运算符{...obj}处理{ a: 1, b: { c: 2 } },改b.c会同步影响原对象 -
深拷贝示例:用
structuredClone(obj)或_.cloneDeep(obj)复制同样对象,改b.c对原对象毫无影响
看数据类型是否完整保留
浅拷贝不改变数据类型,所有内容原样映射(包括函数、undefined、Date、Map 等)。
立即学习“Java免费学习笔记(深入)”;
深拷贝方案能力差异大:JSON.parse(JSON.stringify()) 会丢掉 function、undefined、Symbol、Date、RegExp、Map、Set、BigInt 等,不是真正可靠的深拷贝;而 structuredClone(现代浏览器)和 lodash.cloneDeep 能正确处理多数内置类型。
- 遇到
function或undefined消失了 → 用了 JSON 方案,本质是“伪深拷贝” - Date 变成字符串、正则变空对象 → 同样是 JSON 方案的典型表现
看有没有循环引用报错
如果对象内部存在循环引用(比如 obj.a = obj),未经特殊处理的深拷贝会直接报错 RangeError: Maximum call stack size exceeded。
浅拷贝完全不递归,自然不会爆栈;真正健壮的深拷贝(如 Lodash 或 structuredClone)内部用 WeakMap 缓存已处理对象,能安全跳过循环引用。
- 一拷就崩 → 手写递归没加缓存,或用了不支持循环引用的方案
- 能顺利拷贝且结果可用 → 深拷贝实现较完善
看性能与使用场景是否匹配
浅拷贝快,适合解构赋值、合并配置、临时读取等场景;深拷贝慢,开销随嵌套深度线性增长,只在必须隔离数据时才用,比如表单状态管理、不可变更新、避免副作用。
- 只改顶层字段,不碰嵌套结构 → 浅拷贝足够
- 要提交前生成一份干净副本,后续任意修改都不许污染源数据 → 必须深拷贝
- 不确定数据结构深度或含特殊类型 → 别硬写 JSON 方案,优先选
structuredClone或成熟工具库


















