深浅拷贝的区别

简介: 深浅拷贝的区别

首先要了解什么是浅拷贝,什么是深拷贝,才能更好的清除他们有什么区别,从而如何实现深浅拷贝

一,什么是浅拷贝?

浅拷贝(shallow copy):指创建一个新的数据结构,该数据结构中的元素值是原始数据结构中元素的副本;只复制指向某个对象的指针,而不复制这个对象本身,新旧对象共享一块内存

二,什么是深拷贝?

深拷贝(deep copy):指创建一个新的数据结构,该数据结构中的所有元素及其嵌套元素都是原始数据结构中元素的副本;复制并创建一个一模一样的对象,不共享内存,修改新对象旧对象不会改变

三,深浅拷贝有什么区别?

深拷贝和浅拷贝的区别在于复制数据结构时是否复制了其中的嵌套对象或数组;

选择深拷贝还是浅拷贝取决于具体的需求,以及对数据结构中嵌套元素的处理方式。在处理较为复杂的数据结构时,特别是涉及到嵌套对象或数组的情况下,深拷贝通常更适合确保数据的独立性和完整性;

上述已分析两者区别。

四,浅拷贝如何实现?

像是一些简单的赋值,那就是浅拷贝,

Object.assign()、展开操作符(spread operator)、Array.slice()等也是浅拷贝实现的方法

实例:

 

// 原始数组
const originalArray = [1, 2, 3];
// 使用展开操作符进行浅拷贝
const shallowCopy = [...originalArray];
console.log(shallowCopy); // 输出: [1, 2, 3]

在上面的示例中,[...originalArray] 使用了展开操作符来创建了 originalArray 的浅拷贝。浅拷贝后的数组 shallowCopy 中的元素值与原始数组 originalArray 中的元素值相同,但它们是独立的副本,对其中一个进行修改不会影响另一个。

五,如何实现深拷贝?

使用递归遍历原始数据结构,并对其中的对象和数组进行递归复制。另外,也可以使用现成的第三方库,比如 lodash 中的 cloneDeep 方法来实现深拷贝。

实例:

 

function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    // 如果不是对象或者是null,则直接返回
    return obj;
  }
  let copy = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      copy[key] = deepCopy(obj[key]);
    }
  }
  return copy;
}
// 原始对象
const originalObject = {
  a: 1,
  b: {
    c: 2,
    d: [3, 4]
  }
};
// 深拷贝
const deepClone = deepCopy(originalObject);
console.log(deepClone);

在上面的示例中,deepCopy 函数通过递归遍历原始对象 obj,并对其中的对象和数组进行递归复制,从而实现了深拷贝。

相关文章
TypeScript-类和接口
TypeScript-类和接口
104 0
|
Java 索引
leetcode-39:组合总和
leetcode-39:组合总和
87 0
|
SQL 监控 网络协议
在服务器上部署MySQL服务
在云服务器上部署自己的MySQL服务(centOS7系统),并且配置MySQL主从复制
|
存储
集合框架之Map集合(上)
集合框架之Map集合
155 0
C#编程-15:基本概念复习
C#编程-15:基本概念复习
183 0
C#编程-15:基本概念复习
|
数据可视化 Java API
Swagger基本使用快速上手
Swagger简介 1、是一款让你更好的书写API文档规范且完整的框架。 2、提供描述、生产、消费和可视化RESTful Web Service。 3、是由庞大工具集合支撑的形式化规范。这个集合涵盖了从终端用户接口、底层代码库到商业API管理的方方面面。
673 0
Swagger基本使用快速上手
|
资源调度 JavaScript 前端开发
2021通过Vue2.x对比学习Vue3.x(持续更新)
2021通过Vue2.x对比学习Vue3.x(持续更新)
350 0
2021通过Vue2.x对比学习Vue3.x(持续更新)
|
存储 Kubernetes API
Kubernetes 的审计日志和采集
基础操作 一个正常运行的 Kubernetes 集群,除了利用访问控制对集群操作的许可进行限制之外,对于操作过程的跟踪审计也是比不可少的,围绕不同的实体,例如用户、节点以及各种工作负载进行观测是很有必要的。
1376 0
|
前端开发 SEO
一周总结(六)
10天过去了。 10天的时间里,做了那些东西呢? 经历 前几天的时间,花一些时间和女朋友聊天,分心,去晋江找女朋友,回来开始做东西。 做东西,使用SSM,BUI前端框架,做后台系统。
|
存储 人工智能 C++
2014秋C++ 第14周项目 二维数组
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目1-折腾二维数组】创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后: 通过键盘输入,使后两列的10个元素获得值; 按行序优先输出数组元素; 将所有元素值乘
1486 0