返回

浅尝浅拷贝,深探深拷贝

前端

理解浅拷贝和深拷贝

浅拷贝和深拷贝都是为了复制一个对象而创建的。浅拷贝只复制对象的引用(内存地址),而深拷贝则复制对象的全部内容,包括属性和引用类型属性的值。

浅拷贝

浅拷贝只复制对象本身的属性值,但不复制其引用的对象。这意味着浅拷贝的对象与原对象共享相同的引用对象。当修改浅拷贝的对象时,也会修改原对象。

深拷贝

深拷贝复制对象本身的属性值和其引用的对象。这意味着深拷贝的对象与原对象完全独立,修改深拷贝的对象不会影响原对象。

浅拷贝和深拷贝的实现

在 JavaScript 中,浅拷贝可以通过 Object.assign() 方法实现。深拷贝可以通过 JSON.stringify() 和 JSON.parse() 方法实现,也可以通过递归函数实现。

浅拷贝

const obj1 = {
  name: 'John Doe',
  age: 30,
  address: {
    street: '123 Main Street',
    city: 'Anytown',
    state: 'CA',
  },
};

const obj2 = Object.assign({}, obj1);

console.log(obj2.name); // 'John Doe'
console.log(obj2.age); // 30
console.log(obj2.address); // { street: '123 Main Street', city: 'Anytown', state: 'CA' }

深拷贝

const obj1 = {
  name: 'John Doe',
  age: 30,
  address: {
    street: '123 Main Street',
    city: 'Anytown',
    state: 'CA',
  },
};

const obj2 = JSON.parse(JSON.stringify(obj1));

console.log(obj2.name); // 'John Doe'
console.log(obj2.age); // 30
console.log(obj2.address); // { street: '123 Main Street', city: 'Anytown', state: 'CA' }

浅拷贝和深拷贝的优缺点

浅拷贝和深拷贝各有其优缺点,在不同的场景下适用不同的情况。

浅拷贝的优点

  • 速度快,效率高
  • 实现简单,容易理解
  • 不会创建新的对象,节省内存

浅拷贝的缺点

  • 修改浅拷贝的对象会影响原对象
  • 无法复制引用类型属性的值
  • 不适合复制复杂的对象

深拷贝的优点

  • 可以完全复制对象,包括引用类型属性的值
  • 修改深拷贝的对象不会影响原对象
  • 适合复制复杂的对象

深拷贝的缺点

  • 速度慢,效率低
  • 实现复杂,理解困难
  • 会创建新的对象,占用更多内存

浅拷贝和深拷贝的应用场景

浅拷贝和深拷贝在不同的场景下都有其适用之处。

浅拷贝的适用场景

  • 复制简单对象,如字符串、数字、布尔值等
  • 复制引用类型属性指向的原始值,如字符串、数字、布尔值等
  • 复制引用类型属性指向的不可变对象,如 Date 对象、String 对象、Number 对象等

深拷贝的适用场景

  • 复制复杂对象,如数组、对象、函数等
  • 复制引用类型属性指向的可变对象,如数组、对象、函数等
  • 复制引用类型属性指向的对象包含循环引用