Skip to content

深拷贝与浅拷贝

约 464 字大约 2 分钟

JavaScript深拷贝浅拷贝

2025-06-23

浅拷贝

浅拷贝是指创建一个新对象,然后将现有对象的非对象属性(如基本数据类型)复制给这个新对象,而对象类型的属性则只是复制了引用,这意味着原对象和新对象仍然共享这些对象类型的属性。

实现方法

Object.assign()

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

扩展运算符

  let obj = {a: 1, b: {c: 2}};
  let copy = {...obj};

缺点

注意

如果对象中含有嵌套的对象或数组,那么浅拷贝只会复制一层,嵌套的对象或数组依然是引用关系,改变其中一个会影响另一个。

copy.a = 2;
copy.b.c = 3;
console.log(obj.a);// 输出:1
console.log(obj.b.c); // 输出: 3

深拷贝

深拷贝是递归地复制整个对象,包括所有嵌套的对象和数组,这样原对象和新对象之间不会共享任何引用,从而确保对新对象的任何修改都不会影响到原始对象

实现方法

JSON序列化与反序列化

虽然简单,但有局限性,如无法处理函数、undefined、Symbol等特殊类型的值,且不支持循环引用。

  let obj = {a: 1, b: {c: 2}};
  let deepCopy = JSON.parse(JSON.stringify(obj));

递归实现深拷贝

实现起来较为复杂,性能方面可能不如浅拷贝高效

function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
let clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    clone[key] = deepClone(obj[key]);
  }
}
return clone;
}

// 示例
let obj = {a: 1, b: {c: 2}};
let deepCopy = deepClone(obj);
console.log(deepCopy); // 输出: {a: 1, b: {c: 2}}