浅拷贝只复制第一层属性,新旧对象共享嵌套引用;深拷贝递归复制所有层级,完全独立。常见浅拷贝有展开运算符、object.assign()、slice();深拷贝推荐structuredclone(),其次json方法(有局限)或lodash的_.clonedeep()。

JavaScript 中引用类型变量不能直接用等号 = 复制,否则只是复制了指向同一堆内存的地址,修改新变量会影响原变量。真正克隆需要创建一个**独立的新对象/数组**,和原数据互不影响。
浅拷贝:只复制第一层属性
适用于对象或数组中不包含嵌套引用类型(比如没有对象里再放对象、数组里再放对象)的场景。
-
展开运算符(...):最常用,简洁易读
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();
⚠️ 注意:如果原对象有嵌套对象,浅拷贝后修改嵌套内容,新旧对象仍会互相影响。
深拷贝:完整复制所有层级
当数据结构存在多层嵌套(比如对象里有数组,数组里又有对象),必须用深拷贝。
-
JSON 方法(简单但有局限):
const deepCopy = JSON.parse(JSON.stringify(obj));
✅ 快速、原生支持
❌ 不支持函数、undefined、Symbol、Date、RegExp、Map、Set、循环引用,会丢失这些值 -
structuredClone()(推荐,现代浏览器支持):
const deepCopy = structuredClone(obj);
✅ 支持大多数内置类型(包括 Map、Set、Date、RegExp、ArrayBuffer 等)
✅ 能处理循环引用
❌ IE 不支持,Node.js 17.0+ 才可用 -
Lodash 的 _.cloneDeep():
const deepCopy = _.cloneDeep(obj);
✅ 兼容性最好,功能最全
✅ 支持自定义克隆逻辑
❌ 需引入第三方库
按需选择:怎么判断该用哪种?
看你的数据结构和运行环境:
- 纯数据对象(无函数、无特殊类型、无嵌套)→ 浅拷贝够用
- 有嵌套但结构简单、不涉及 Date/RegExp/循环引用 →
JSON.parse + stringify - 项目支持现代浏览器或较新 Node.js → 优先用
structuredClone - 需要最大兼容性或复杂场景(如含函数、自定义类)→ 用 Lodash 或手写递归深拷贝
手动实现简易深拷贝(理解原理用)
适合学习,不建议生产环境直接使用(缺少边界处理):
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof Array) return obj.map(item => deepClone(item));
if (obj instanceof Object) {
const cloned = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloned[key] = deepClone(obj[key]);
}
}
return cloned;
}
}
实际项目中,优先选成熟方案更安全可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











