浅拷贝和深拷贝

简介: 浅拷贝和深拷贝

在JavaScript中,浅拷贝和深拷贝都是用于复制一个对象的方式,但它们在复制过程中的方式和结果有所不同。

浅拷贝是创建一个新对象,将原始对象的属性值复制到新对象中。如果属性是基本类型,则直接复制其值;如果属性是引用类型,则复制的是引用地址,因此新旧对象会共享同一个引用地址。浅拷贝只复制了对象的一层,不会递归复制子对象。

举例说明浅拷贝:

// 使用Object.assign()进行浅拷贝
const obj1 = { foo: 'bar', age: 20 };
const obj2 = Object.assign({}, obj1);
obj2.foo = 'baz';
console.log(obj1); // { foo: 'bar', age: 20 }
console.log(obj2); // { foo: 'baz', age: 20 }
// 使用展开运算符(...)进行浅拷贝
const arr1 = [1, 2, [3, 4]];
const arr2 = [...arr1];
arr2[0] = 5;
arr2[2].push(6);
console.log(arr1); // [1, 2, [3, 4, 6]]
console.log(arr2); // [5, 2, [3, 4, 6]]

深拷贝是创建一个新对象,递归地将原始对象及其子对象的属性值复制到新对象中。整个复制过程是完全独立的,新对象和原对象不共享任何引用地址。

举例说明深拷贝:

// 使用JSON.stringify()和JSON.parse()进行深拷贝
const obj1 = { foo: 'bar', age: 20 };
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.foo = 'baz';
console.log(obj1); // { foo: 'bar', age: 20 }
console.log(obj2); // { foo: 'baz', age: 20 }
// 使用递归函数进行深拷贝
function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  
  let copy = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      copy[key] = deepCopy(obj[key]);
    }
  }
  
  return copy;
}
const arr1 = [1, 2, [3, 4]];
const arr2 = deepCopy(arr1);
arr2[0] = 5;
arr2[2].push(6);
console.log(arr1); // [1, 2, [3, 4]]
console.log(arr2); // [5, 2, [3, 4, 6]]

使用场景:

  • 浅拷贝适用于需要快速创建新对象且只关心第一层属性的情况。例如,将对象的部分属性做修改,而不影响原始对象。
  • 深拷贝适用于需要完全独立的新对象,无论是修改新对象还是原始对象,都互不影响的情况。例如,复制对象作为函数参数,保持原始对象的完整性。
目录
相关文章
|
6月前
|
设计模式 存储 Java
深拷贝与浅拷贝,就是这么简单
深拷贝与浅拷贝,就是这么简单
|
JSON Java API
深拷贝、浅拷贝
深拷贝、浅拷贝
78 0
|
24天前
|
JavaScript 前端开发 Java
什么是深拷贝,什么是浅拷贝
什么是深拷贝,什么是浅拷贝
41 0
|
4月前
|
编译器 C++
深拷贝和浅拷贝介绍
这篇文章讨论了C++中的数据拷贝,特别是浅拷贝和深拷贝的概念。对于基本类型和简单对象,拷贝是按位复制,即浅拷贝,类似于`memcpy()`函数的效果。当类包含动态分配的内存或其他资源时,需要显式定义拷贝构造函数以实现深拷贝,确保对象间的独立性。文中通过一个自定义的变长数组类`Array`示例说明了深拷贝的必要性,并展示了不使用深拷贝可能导致的问题。通常,如果类有指针成员,大部分情况需要深拷贝;否则,浅拷贝可能就足够了。文章还提到了在创建对象时需要预处理的情况,如记录对象创建时间或计数,这也需要深拷贝。
42 0
|
6月前
什么是深拷贝和浅拷贝哇
什么是深拷贝和浅拷贝哇
|
12月前
|
C++
22 C++ - 深拷贝和浅拷贝
22 C++ - 深拷贝和浅拷贝
45 0
|
编译器 C++
C++中的深拷贝和浅拷贝介绍
对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: class Base{ public: Base(): m_a(0), m_b(0){ } Base(int a, int b): m_a(a), m_b(b){ } private: int m_a; int m_b; }; int main(){ int a = 10; int b = a; //拷贝 Base obj1(10, 20);
120 0
|
Java
浅拷贝与深拷贝
浅拷贝与深拷贝
84 0
|
前端开发
对于深拷贝与浅拷贝的理解
对于深拷贝与浅拷贝的理解
深拷贝和浅拷贝
类里面会为我们实现默认的拷贝,这个做的是值的拷贝,但是假如对象里的数据成员在堆上开辟了内存资源,如果继续浅拷贝就会导致两根指针指向同一块资源,从而产生内存泄漏问题。但是深拷贝可以解决这个问题,本文将详细介绍深拷贝与浅拷贝。