浅拷贝只复制对象第一层属性,引用类型仍共享内存;深拷贝递归复制所有层级,新旧对象完全独立。常用浅拷贝有展开运算符、Object.assign()、slice();深拷贝推荐structuredClone()、JSON序列化(有局限)或lodash的cloneDeep()。

什么是浅拷贝和深拷贝
浅拷贝只复制对象的第一层属性,如果属性值是引用类型(比如对象、数组),新旧对象仍共享同一内存地址;深拷贝则递归复制所有层级,新对象与原对象完全独立,修改互不影响。
常用浅拷贝方法及注意事项
适合简单对象或确定无嵌套引用的场景:
-
展开运算符(...):
const copy = {...obj}—— 仅对第一层有效,嵌套对象仍是引用 -
Object.assign():
Object.assign({}, obj)—— 同样只拷贝一层,且会忽略原型链上的属性 -
Array.prototype.slice() / concat():用于数组浅拷贝,
[...arr]更现代直观
可靠深拷贝方案推荐
没有银弹,需按场景选择:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- JSON.parse(JSON.stringify()):最简写法,但不支持函数、undefined、Symbol、Date、RegExp、循环引用,且会丢失原型和特殊类型
-
structuredClone()(现代浏览器 & Node.js 17+):
structuredClone(obj)—— 原生支持多数类型(含 Map、Set、Date、RegExp),不支持函数和某些内置类,且要求可序列化 - Lodash 的 _.cloneDeep():兼容性好、健壮性强,能处理函数、循环引用、稀疏数组等边界情况,适合生产环境
如何判断是否需要深拷贝
关键看后续操作是否会修改嵌套数据:
- 只是读取或替换整个对象 → 浅拷贝足够
- 要 push/splice 数组、修改子对象属性、或在异步/多处复用中避免副作用 → 必须深拷贝
- 不确定结构或来自外部(如 API 响应)→ 默认倾向深拷贝,或根据实际字段做针对性拷贝










