🚀 对象的深拷贝和浅拷贝的区别
欢迎来到我的博客文章!所有文章都是满满的前端干货,文章简明扼要。
一、核心区别
| 特性 | 浅拷贝 | 深拷贝 |
| 基本类型属性 | ✅ 完全复制(值拷贝) | ✅ 完全复制 |
| 引用类型属性(如对象、数组) | ❌ 只复制引用地址(新旧对象共享同一内存) | ✅ 递归创建全新副本(独立内存) |
| 修改嵌套属性是否影响原对象? | ✅ 会互相影响 | ❌ 完全隔离 |
三、浅拷贝的实现方法
1. 展开运算符(Spread Operator)
const obj = { a: 1, b: { c: 2 } };
const copy = { ...obj };
copy.b.c = 99;
2. Object.assign()
const copy = Object.assign({}, obj);
3. Array.prototype.slice() / concat()(仅数组)
const arr = [1, 2, [3, 4]];
const copy1 = arr.slice();
const copy2 = arr.concat();
四、深拷贝的实现方法
✅ 方法 1:JSON.parse(JSON.stringify())(简单场景)
const obj = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(obj));
仅适用于纯 JSON 数据(如 API 响应)。
方法 2:递归实现(推荐基础版)
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
const clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
方法 4:使用第三方库(最可靠)
- Lodash: _.cloneDeep(obj)
- structuredClone()(现代浏览器/Node.js 17+)
五、如何选择?
| 场景 | 推荐方法 |
| 简单数据(无函数、日期、循环引用) | JSON.parse(JSON.stringify()) |
| 需要兼容老环境 + 基础对象 | 递归实现(方法2) |
| 生产环境 + 复杂对象 | Lodash _.cloneDeep 或 structuredClone |
| 仅复制一层 | 展开运算符 {...obj} |