浅拷贝和深拷贝的区别是什么?如何代码实现深拷贝?
-
浅拷贝(Shallow Copy):
- 浅拷贝创建一个新对象,但是这个新对象的属性值是指向原始对象属性值的引用。
- 对于对象属性是基本数据类型的,浅拷贝会复制其值。
- 对于对象属性是对象(或数组)的,浅拷贝只复制引用,而不复制对象本身。
-
深拷贝(Deep Copy):
- 深拷贝创建一个新对象,并且递归地复制所有子对象的属性。
- 深拷贝确保原始对象和新对象之间没有任何引用关联,修改新对象不会影响原始对象。
如何实现深拷贝
使用 JSON.parse(JSON.stringify(obj)) 有局限性 很多类型不支持
const original = {
a: 1,
b: [1, 2, 3],
c: { d: 4 },
e: new Date(),
f: /a/gi,
g: new Set([1, 2, 3]),
h: new Map([['a', 1], ['b', 2]]),
i: new Error('error'),
j: null,
k: undefined,
l: BigInt(1)
};
const deepCopied = JSON.parse(JSON.stringify(original));
使用 structuredClone(obj)
const deepCopieds = structuredClone(original);
// 测试 original.b.push(4); original.c.d = 5;
console.log("Original:", original);
console.log("deepCopied:",deepCopied);
console.log("deepCopieds:", deepCopieds);