浅拷贝与深拷贝的定义
浅拷贝只复制对象的第一层属性,如果属性是引用类型(如对象、数组),拷贝的是引用地址而非实际值。深拷贝会递归复制所有层级的属性,生成一个完全独立的新对象。
浅拷贝的实现方式
Object.assign()
适用于对象的第一层属性为基本类型的情况:
const obj = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, obj);
扩展运算符
同理适用于简单对象:
const arr = [1, 2, { d: 3 }];
const shallowArr = [...arr];
深拷贝的实现方式
JSON.parse(JSON.stringify())
局限性:无法处理函数、undefined、循环引用等。
const obj = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(obj));
递归实现
完整处理各种数据类型和循环引用:
function deepClone(target, map = new WeakMap()) {
if (typeof target !== 'object' || target === null) return target;
if (map.has(target)) return map.get(target);
const clone = Array.isArray(target) ? [] : {};
map.set(target, clone);
for (const key in target) {
clone[key] = deepClone(target[key], map);
}
return clone;
}
核心区别场景
修改嵌套属性时
浅拷贝的嵌套对象会互相影响:
const original = { x: { y: 10 } };
const shallow = { ...original };
shallow.x.y = 20;
console.log(original.x.y); // 输出 20
深拷贝的嵌套对象完全独立:
const original = { x: { y: 10 } };
const deep = deepClone(original);
deep.x.y = 20;
console.log(original.x.y); // 输出 10
3768

被折叠的 条评论
为什么被折叠?



