5、浅拷贝与深拷贝

简介: 5、浅拷贝与深拷贝

1、总结


浅拷贝和深拷贝都是用于对象拷贝的,区别在于浅拷贝是复制对象地址的,只要数据改变,原对象数据会跟着改变;而深拷贝是复制数据,再新建一个地址,数据改变不会影响原对象的数据,深拷贝有两种方法,一种是JSON转换,另一种是用递归方法复制对象数据,推荐用JSON转换,方便快捷,就是这么简单。


2、浅拷贝


  • 拷贝的是地址,修改拷贝后的数据对原对象有影响


<script>
  /*
  1、浅拷贝:拷贝的是地址,修改拷贝后的数据对原对象有影响
  2、深拷贝:拷贝的是数据,修改拷贝后的数据对原对象没有影响
  */
  var obj = {
    name: 'jasmine',
    age: 18,
    hobby: ['画画', '唱歌'],
    friend: {
      name: 'qiqi',
      age: 18
    }
  }
  //  3、浅拷贝
  var obj1 = obj;
  obj.name = 'jasmine1';
  console.log(obj);   //  jasmine1
  console.log(obj1);  //  jasmine1
</script>

3、深拷贝


  • 拷贝的是数据,重新创建一个地址,修改拷贝后的数据对原对象没有影响


4、深拷贝有两种方法(JSON和递归)


JSON:


  • let json = JSON.stringify(obj);
  • obj1 = JSON.parse(json);


  //  4、深拷贝,有两种拷贝方法
  //  4.1、第一种方法:用json转换
  //  4.2、第二种方法:递归
  var obj = {
    name: 'jasmine',
    age: 18,
    hobby: ['画画', '唱歌'],
    friend: {
      name: 'qiqi',
      age: 18
    }
  }
  //  把对象转为JSON格式的字符串,自动进行深拷贝
  let json = JSON.stringify(obj);
  console.log(json);
  //  再把JSON格式的字符串转为对象
  obj1 = JSON.parse(json);
  obj1.name = "jasmine";
  console.log(obj1);  //  jasmine

递归:


  • 用for循环遍历数据,把数据添加到新的对象中,如果里面有引用类型数据,则要用到递归。
  • 不能直接拷贝地址,要声明一个空数组然后遍历对象数组,把里面的元素添加到新的数组里面
  • 对象也是一样的,创建一个新的对象,然后把对象的数据放到里面即可
  • 相对于递归,用JSON格式转换会方便很多
  //  4.2、第二种方法:递归,把所有的属性添加到新的对象中
  //  如果里面有引用类型数据(数组、对象),
  //  则不能直接拷贝地址,要声明一个空数组然后遍历对象数组,把里面的元素添加到新的数组里面
  //  对象也是一样的,创建一个新的对象,然后把对象的数据放到里面即可
  //  相对于递归,用JSON格式转换会方便很多
  function copy(newObj, obj) {
    for (let i in obj) {
      //  判断是不是数组类型
      if (obj[i] instanceof Array) {
        //  声明一个空数组,然后拷贝数组里面的数组
        newObj[i] = [];
        copy(newObj[i], obj[i]);
        //  判断是不是数组类型
      } else if (obj[i] instanceof Object) {
        //  声明一个空数组,然后拷贝对象里面的数组
        newObj[i] = {};
        copy(newObj[i], obj[i]);
      } else {
        newObj[i] = obj[i];
      }
    }
  }
  obj1 = {};
  copy(obj1, obj);
  obj1.hobby[0] = '插画';
  console.log(obj1);


5、源代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
</body>
<script>
  /*
  1、浅拷贝:拷贝的是地址,修改拷贝后的数据对原对象有影响
  2、深拷贝:拷贝的是数据,修改拷贝后的数据对原对象没有影响
  */
  var obj = {
    name: 'jasmine',
    age: 18,
    hobby: ['画画', '唱歌'],
    friend: {
      name: 'qiqi',
      age: 18
    }
  }
  //  3、浅拷贝
  var obj1 = obj;
  obj.name = 'jasmine1';
  console.log('原对象:')
  console.log(obj);   //  jasmine1
  console.log('浅拷贝:')
  console.log(obj1);  //  jasmine1
  //  4、深拷贝,有两种拷贝方法
  //  4.1、第一种方法:用json转换
  //  把对象转为JSON格式的字符串,自动进行深拷贝
  let json = JSON.stringify(obj);
  console.log('转为JSON字符串:')
  console.log(json);
  //  再把JSON格式的字符串转为对象
  obj1 = JSON.parse(json);
  obj1.name = "jasmine";
  console.log('深拷贝(JSON):')
  console.log(obj1);  //  jasmine
  //  4.2、第二种方法:递归,把所有的属性添加到新的对象中
  //  如果里面有引用类型数据(数组、对象),
  //  则不能直接拷贝地址,要声明一个空数组然后遍历对象数组,把里面的元素添加到新的数组里面
  //  对象也是一样的,创建一个新的对象,然后把对象的数据放到里面即可
  //  相对于递归,用JSON格式转换会方便很多
  function copy(newObj, obj) {
    for (let i in obj) {
      //  判断是不是数组类型
      if (obj[i] instanceof Array) {
        //  声明一个空数组,然后拷贝数组里面的数组
        newObj[i] = [];
        copy(newObj[i], obj[i]);
        //  判断是不是数组类型
      } else if (obj[i] instanceof Object) {
        //  声明一个空数组,然后拷贝对象里面的数组
        newObj[i] = {};
        copy(newObj[i], obj[i]);
      } else {
        newObj[i] = obj[i];
      }
    }
  }
  obj1 = {};
  copy(obj1, obj);
  obj1.hobby[0] = '插画';
  console.log(obj1);
</script>
</html>


相关文章
|
监控 JavaScript 前端开发
影刀RPA(初级)(二)
影刀RPA(初级)(二)
8395 2
|
2月前
|
存储 数据安全/隐私保护 开发者
Python深浅拷贝全解析:从原理到实战的避坑指南
在Python开发中,深浅拷贝是处理对象复制的关键概念。直接赋值仅复制引用,修改副本会影响原始数据。浅拷贝(如切片、copy方法)创建新容器但共享嵌套对象,适用于单层结构或需共享子对象的场景;而深拷贝(copy.deepcopy)递归复制所有层级,确保完全独立,适合嵌套结构或多线程环境。本文详解二者原理、实现方式及性能考量,帮助开发者根据实际需求选择合适的拷贝策略,避免数据污染与性能浪费。
172 1
|
2月前
|
人工智能 自然语言处理 前端开发
Open WebUI 和 Dify 在构建企业AI应用时的主要区别
Open WebUI与Dify是企业AI落地的两大开源方案,定位差异显著。Open WebUI专注零代码交互界面开发,适合快速部署对话式前端;Dify提供全栈低代码平台,支持AI应用全生命周期管理。前者优势在轻量化UI组件,后者强于复杂业务编排与企业级功能。企业可根据需求选择前端工具或完整解决方案,亦可组合使用实现最优效果。
|
存储 分布式计算 OLAP
Apache Paimon统一大数据湖存储底座
Apache Paimon,始于Flink Table Store,发展为独立的Apache顶级项目,专注流式数据湖存储。它提供统一存储底座,支持流、批、OLAP,优化了CDC入湖、流式链路构建和极速OLAP查询。Paimon社区快速增长,集成Flink、Spark等计算引擎,阿里巴巴在内部广泛应用,旨在打造统一湖存储,打通Serverless Flink、MaxCompute等,欢迎大家扫码参与体验阿里云上的 Flink+Paimon 的流批一体服务。
18288 8
Apache Paimon统一大数据湖存储底座
|
存储 分布式计算 Java
大数据存储技术(3)—— HBase分布式数据库
大数据存储技术(3)—— HBase分布式数据库
4865 0
|
云安全 存储 Cloud Native
怎么样能顺利通过阿里云ACE考试?难度是不是很大?
阿里云认证是现在IT行业内广受认可的一个认证,其中难度最高的就是ACE考试,很大人都会选择考这个这个来提升自己的就业竞争力,但是自从ACE改版之后,难度大大增加,考试的内容和形式很多人都不了解。
893 1
怎么样能顺利通过阿里云ACE考试?难度是不是很大?
|
XML 消息中间件 SpringCloudAlibaba
Spring——2、使用@ComponentScan自动扫描组件并指定扫描规则
在实际项目中,我们更多的是使用Spring的包扫描功能对项目中的包进行扫描,凡是在指定的包或其子包中的类上标注了@Repository、@Service、@Controller、@Component注解的类都会被扫描到,并将这个类注入到Spring容器中。 Spring包扫描功能可以使用XML配置文件进行配置,也可以直接使用@ComponentScan注解进行设置,使用@ComponentScan注解进行设置比使用XML配置文件来配置要简单的多。
676 0
Spring——2、使用@ComponentScan自动扫描组件并指定扫描规则
|
弹性计算 Java 关系型数据库
使用阿里云服务器ecs结合宝塔面板部署项目
由于项目需要将后台部署上云端,曾经通过“飞天加速计划”免费领到过一台云服务器ecs,不过如今服务器试用期结束,我的项目也部署完毕了,下面就将我部署过程的写成文章分享出来,希望可以记录一下此次部署的经历。
953 2
使用阿里云服务器ecs结合宝塔面板部署项目
|
SQL Java
PageHelper 分页无效的坑。。。
1.问题 阿里巴巴Java开发手册:
716 0
PageHelper 分页无效的坑。。。
|
Java 测试技术 持续交付
老司机使用CompletableFuture实现集成任务失败后自动重跑
0 老司机集成任务在Aone实验室中遇到的问题  老司机平台是一个集合了用例管理,用例执行,测试沉淀等功能的一站式集成测试平台。老司机中提供了一种名为集成任务的测试件,它一般包含一组核心的可执行用例,主要在变更发布前回归指定的接口或应用时由平台或手工触发运行。也可以在每日定时执行指定的集成任务,以实现用例与测试任务的持续集成。  集成任务用作发布前的卡点测试件时,一般是在流水线中加入Aone实验室
1554 1
老司机使用CompletableFuture实现集成任务失败后自动重跑