区别深拷贝和浅拷贝?如何实现一个深拷贝?
深拷贝和浅拷贝的区别主要在于复制对象时对其引用类型属性的处理方式:
-
浅拷贝(Shallow Copy):
- 创建一个新对象,但只复制对象的第一层属性。如果对象中有引用类型的属性,浅拷贝仅复制这些引用,而不复制引用指向的对象。因此,原对象和新对象共享相同的引用类型属性。
- 在 JavaScript 中,可以通过
Object.assign()
或扩展运算符(...
)实现浅拷贝。
const original = { a: 1, b: { c: 2 } }; const shallowCopy = { ...original }; shallowCopy.b.c = 3; // 修改了原对象的引用 console.log(original.b.c); // 输出 3
-
深拷贝(Deep Copy):
- 创建一个新对象,并递归地复制对象的所有层级属性。即使是引用类型的属性也会被复制,原对象和新对象完全独立。
- 可以使用
JSON.parse()
和JSON.stringify()
方法进行深拷贝,但这种方法有局限性(如不能复制函数、undefined
、Symbol
等)。 - 另一种常见方法是使用递归函数。
const original = { a: 1, b: { c: 2 } }; const deepCopy = JSON.parse(JSON.stringify(original)); deepCopy.b.c = 3; // 修改了深拷贝的引用 console.log(original.b.c); // 输出 2
使用递归函数的实现示例如下:
function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } if (Array.isArray(obj)) { return obj.map(deepClone); } const copy = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepClone(obj[key]); } } return copy; }
这样,就可以实现深拷贝,确保原对象和新对象完全独立。