跳到主要内容

Javascript 浅拷贝/深度拷贝的区别?

参考答案:

在JavaScript中,浅拷贝(Shallow Copy)和深度拷贝(Deep Copy)的主要区别在于它们处理对象或数组的方式。具体来说,这两种拷贝方式在处理嵌套的对象或数组时会有不同的行为。

浅拷贝(Shallow Copy)

浅拷贝只复制对象或数组的顶层属性。如果对象或数组中包含其他对象或数组,那么这些内部对象或数组只是被引用,而不是被复制。这意味着,如果你修改了原始对象或数组中的任何内部对象或数组,那么这些修改也会反映在浅拷贝的对象或数组中,因为它们引用的是同一个内部对象或数组。

例如,使用Object.assign()方法或数组的slice()方法进行的是浅拷贝。

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = Object.assign({}, obj1);

obj1.b.c = 3;

console.log(obj2.b.c);  // 输出 3,因为 obj1 和 obj2 中的 b 属性引用的是同一个对象

深度拷贝(Deep Copy)

深度拷贝会复制对象或数组以及它们所有的内部对象或数组。这意味着,如果你修改了原始对象或数组中的任何内部对象或数组,那么这些修改不会反映在深度拷贝的对象或数组中,因为它们有独立的内部对象或数组副本。

在JavaScript中,没有内置的深度拷贝函数,但你可以通过递归的方式实现深度拷贝。或者使用一些第三方库(如 lodash 的 _.cloneDeep 方法)来实现深度拷贝。

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = JSON.parse(JSON.stringify(obj1));  // 使用 JSON 方法实现深度拷贝

obj1.b.c = 3;

console.log(obj2.b.c);  // 输出 2,因为 obj1 和 obj2 中的 b 属性引用的是不同的对象

需要注意的是,深度拷贝可能会比浅拷贝更消耗资源,因为它需要复制更多的数据。另外,有些对象(如函数、Date对象、RegExp对象等)在深度拷贝时可能无法被正确地复制。因此,在选择使用浅拷贝还是深度拷贝时,需要根据你的具体需求和场景来决定。