浅拷贝只复制第一层属性,嵌套对象共享引用;深拷贝递归复制所有层级,生成完全独立对象。常见浅拷贝方法有展开运算符、object.assign()、slice()等;深拷贝可用structuredclone、json序列化(有局限)或手写递归实现,需注意函数、undefined、循环引用等特殊场景。

浅拷贝只复制对象的第一层属性,嵌套对象仍共享引用;深拷贝则递归复制所有层级,生成完全独立的新对象。
浅拷贝的常见实现方式
浅拷贝适用于一层结构的对象或数组,不处理嵌套引用。
-
展开运算符(...):最简洁,适合数组和对象字面量
const newObj = { ...oldObj };或const newArr = [...oldArr]; -
Object.assign():第一个参数是目标对象,后续为源对象
const newObj = Object.assign({}, oldObj); -
Array.prototype.slice() / concat():仅限数组
const newArr = oldArr.slice();或const newArr = oldArr.concat();
深拷贝的典型实现逻辑
深拷贝需遍历所有嵌套层级,对每个值判断类型并递归处理。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
JSON序列化反序列化:简单但有局限(不支持函数、undefined、Symbol、循环引用、Date等)
const deepCopy = JSON.parse(JSON.stringify(obj)); -
递归实现:手动判断类型,基础类型直接返回,引用类型递归拷贝
对 null、数组、对象分别处理,其他如 Date、RegExp 等需单独适配 -
structuredClone()(现代浏览器):原生 API,支持多数内置类型(不含函数、undefined),无循环引用限制
const deepCopy = structuredClone(obj);
如何识别是否真正深拷贝成功
关键看修改副本是否影响原始数据,尤其测试嵌套对象或数组。
- 修改
copy.nested.prop后,检查original.nested.prop是否不变 - 用
===比较嵌套对象引用:copy.nested === original.nested应为 false - 注意 Date、RegExp、Map、Set 等特殊对象,部分深拷贝方法可能丢失类型或内容
选择策略建议
根据数据结构复杂度和运行环境决定方案。
- 纯数据对象(无函数、无循环引用)且兼容性要求不高 →
structuredClone - 需要兼容旧环境或定制行为 → 手写递归深拷贝(可借助 lodash 的
cloneDeep) - 仅需一层复制 → 展开运算符或
Object.assign更轻量高效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










