浅拷贝深拷贝递归

news2025/2/4 20:47:55

常见的基本数据类型:Number、String 、Boolean、Null和Undefined

引用数据类型:Object、Array、Function

1)基本数据类型:存储在栈内存中,可以直接访问到该变量的值。

2)引用数据类型:存储在堆内存中,每个堆内存对象都有对应的引用地址指向它,引用地址存放在栈中

浅拷贝 : 只是将数据中所有的数据引用下来,依旧指向同一个存放地址,拷贝之后的数据修改之后,也会影响到原数据的中的对象数据

深拷贝: 将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据

深拷贝和浅拷贝是只针对引用数据类型(Object和Array)

拷贝等易于赋值 但是它又和赋值有着区别

先来看两个例子,对比赋值与浅拷贝会对原数据带来哪些改变

例1给对象赋值:原数据也会一起改变

      //给对象赋值
       var obj = {
          'name': '小红',
          'age': 16,
          'like': [1, [2, 3], [4, 5]],
        }
        var obj1 = obj
        obj1.name = "小明"
        obj1.like = ["篮球", "跳远"]
        console.log(obj, "obj");
        console.log(obj1, "obj1");

                               原数据以及原数据中包含的子对象都发生了改变 :

例2利用浅拷贝给对象赋值:原数据不会发生改变,但是给原数据中的子对象赋值的话会使原数据中的子对象发生改变

     //利用浅拷贝给对象赋值
        var obj = {
          'name': '小红',
          'age': 16,
          'like': [1, [2, 3], [4, 5]],//子对象
        }
        var obj1 = shallowCopy(obj)
        obj1.name = "小明"
        obj1.like[1] = ["篮球", "跳远"] //修改子对象
        function shallowCopy(src) {
          var str = {};
          for (var prop in src) {
            if (src.hasOwnProperty(prop)) {
              str[prop] = src[prop]
            }
          }
          return str
        }
        console.log(obj, "obj");
        console.log(obj1, "obj1");

                                         原数据不变,原数据中包含的子对象发生改变: 

 总结: 

 

浅拷贝的实现方式

1.Object.assign()

Object.assign() 是 Object 的一个方法,第一个参数是拷贝的目标对象,后面的参数是拷贝的来源对象。

    var obj = {};
    var objass = {
      name: '小红',
      info: {
        age: 18
      }
    };
    Object.assign(obj, objass);
    obj.info.age = 28
    obj.name = "小明"
    console.log(objass,"原数据");
    console.log(obj,"浅拷贝后的数据");

                                原数据不变,原数据中包含的子对象改变:

2.Array.prototype.concat()

Array.prototype.concat()是数组的一个方法,使用场景比较少,使用concat连接一个含有引用类型的数组时,需要注意修改原数组中的元素的属性,因为它会影响拷贝之后连接的数组

        var arr = [1, 2, { name: '小红' }];
        var newArr = arr.concat();
        newArr[2].name = 'wy';
        console.log(arr);
        console.log(newArr);

                                       原数据不变,原数据中包含的子对象改变:

3.Array.prototype.slice()

Array.prototype.slice()是数组的一个方法,同cancat

        var arr = [1,3,{name:"小红"}]
        var str = arr.slice()
        str[2].name="小明"
        console.log(arr)

深拷贝的实现方式 

1.JSON.parse(JSON.stringify())

原理: 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝 (针对对象和数组)

        var arr = [1,3,{name:"小红"}]
        var str =JSON.parse(JSON.stringify(arr))
        str[2].name="小明"
        console.log(arr,str)

                                        原数据以及原数据中包含的子对象都不会发生改变:

2.递归方法

原理:遍历对象和数组直到里边都是基本数据类型,然后再去复制

function deepClone1(obj) {
  //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
  var objClone = Array.isArray(obj) ? [] : {};
  var key = null
  if (obj && typeof obj === "object") {
    for (key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (obj[key] && typeof obj[key] === "object") {
          objClone[key] = deepClone1(obj[key]);
        } else {
          objClone[key] = obj[key];
        }
      }
    }
  }
  return objClone;
}
var arr = [1, 2, { name: "小红" }]
var str = deepClone1(arr)
str[2].name = "小明" //修改原数据中的子对象
console.log(arr, "原数据");
console.log(str, "通过递归深拷贝的数据");

                             原数据以及原数据中包含的子对象都不会发生改变: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有哪些数据统计软件适合初学者使用?

前段时间写过一篇“数据分析工具”的内容,周末有伙伴私信问我有没有什么适合初学者、业务人员的,更简单一点的数据可视化软件。 所以今天来分享下我在做数据分析时用过的几个简单易上手的数据可视化软件。 先放上目录: 数据统计收集类——简…

谷粒学院——Day12【整合阿里云短信服务、首页登录和注册】

用户登录业务介绍 一、单一服务器模式 早期单一服务器,用户认证。 缺点:单点性能压力,无法扩展。 二、SSO(single sign on)模式 分布式,SSO(single sign on)模式 优点: 用户身份信息独立管理,更好的…

关于安科瑞电气安全产品在医药工业洁净厂房的电气工程设计与应用

摘要: 近年来,医药工业洁净厂房的电气工程设计得到了快速发展和广泛关注,研究其相关课题有着重要意义。首先介绍了供电系统与配电设备的设置,分析了洁净厂房的电气照明设计,并结合相关实践经验,从探测器选…

智能无障碍轮椅——ESP8266总体介绍及ESP-01S入门调试

文章目录ESP8266 介绍ESP8266的多种型号1. DT-062. ESP-01和ESP-01S【左边ESP-01S,右边ESP-01】3. ESP-12F两种开发方式1. AT指令开发方式2. SDK开发方式固件烧录方法1. 硬件烧录工具2. 软件烧录工具WiFi模块工作模式:1. AP模式2. STA模式3. STAAP共存ES…

宏、条件编译(#ifdef)、#include(头文件包含)、#error和 #pragma的区别、#和##的含义和应用

1、在C语言预处理阶段,编译器首先对代码的处理时:先去注释,再宏替换。 2、在源文件的任何地方,宏都是可以定义的,与是否在函数内外无关。 3、宏的作用范围是:从定义处开始,往后的直到程序结束…

C++(老百科)

学了这么久的c,你们有没有想过一个问题:什么是c?(这还用问么,不大街上随便抓一个陌生人都知道)(那你现在给我抓个看看) C简介 C是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。––…

easyexcel读取excel将数据存到mysql【一个简单的例子】

读取excel 1 xml里面增加maven <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> </depen…

项目管理软件适用于初创公司吗

我注意到关于小型团队的一件事是&#xff0c;在这种热情的背后隐藏着一家需要帮助的公司。他们通常缺乏职责结构&#xff0c;但这可能不是他们的主要需求。太多的结构会扼杀那些在较小的初创型公司中经营节目的企业家精神的努力&#xff0c;但他们几乎总是需要更有效的流程和一…

分布式理论之CAP定理

CAP定理介绍 CAP定理&#xff08;CAP theorem&#xff09;&#xff0c;又被称作布鲁尔定理&#xff08;Brewers theorem&#xff09;&#xff0c;它指出对于一个分布式计算系统来说&#xff0c;不可能同时满足以下三点 选项具体意义一致性&#xff08;Consistency&#xff09…

linux TxBytes RxBytes 探究

测试平台 &#xff1a;NXP LS1043A ARM64 内核版本&#xff1a; 两台设备通过网口eth2 对接。设备1发包&#xff0c;设备2收包&#xff0c;观察两设备 TX RX 包数、字节数。 1、准备数据包 流量仪设置包长1024, 抓取从流量仪发包&#xff0c;wireshark显示length 1020字…

即时通讯音视频开发之音频编解码技术的学习

总是有人问我研究音频编解码要看什么书&#xff0c;其实这是一个很难回答的问题&#xff0c;原因有很多&#xff1a; 做工程首先一个问题就是和课本学习不同&#xff0c;不是看书能解决的。 音频编解码技术在国内研究的人很少&#xff0c;包括总体的音频技术国外也研究不多…

攻防世界ics-06

攻防世界ics-06 题目描述&#xff1a;云平台报表中心收集了设备管理基础服务的数据&#xff0c;但是数据被删除了&#xff0c;只有一处留下了入侵者的痕迹。 打开场景&#xff0c;查看页面。 但凡有超链接的都点一遍&#xff0c;发现只有“报表中心可以打开”。 选择日期范围&a…

go 库 viper 配置解析神器

文章目录1. 简介2. 安装3. 建立默认值4. 读取配置文件5. 获取 key/value 方法5.1 Get() 方法5.2 IsSet()、GetStringMap()、GetStringMap() 方法6. 命令行选项7. 访问嵌套的键8. 写入配置文件9. 监控并重新读取配置文件10. 从io.Reader中读取11. Unmarshal12. 环境变量13. 远程…

【Three.js入门】图形用户界面GUI、BufferGeometry创建矩形、随机生成多个随机颜色的三角形

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

第四章操作系统测试

一. 单选题&#xff08;共24 题&#xff0c;72.0分&#xff09; (单选题,3.0分)用户编写的程序中所使用的地址是&#xff08; C &#xff09;。 A. 内存地址 B. 物理地址 C. 逻辑地址 D. 绝对地址 解释&#xff1a;逻辑地址&#xff1a;用户空间中使用的一种地址又称相对地址 …

一行 Python 代码能实现什么丧心病狂的功能?

手头有 109 张头部 CT 的断层扫描图片&#xff0c;我打算用这些图片尝试头部的三维重建。基础工作之一&#xff0c;就是要把这些图片数据读出来&#xff0c;组织成一个三维的数据结构&#xff08;实际上是四维的&#xff0c;因为每个像素有 RGBA 四个通道&#xff09;。这个数据…

gitLab

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。下面是使用步骤 1. 注册 进入注册页面&#xff08;需要公司的人提供地址&#xff09;例如&#xff1a; http://xx.xxx.xx.xx:18000/users/sign_in …

大漠插件最新版7.2248

工具名称:大漠插件最新版7.2248 工具简介:/ v7.2242更新时间2022年11月16日:/ v7.2248 1. 优化某些模式,在绑定时,有小概率会卡死在绑定函数里的问题. 2. 解决Assemble DisAssemble和GetRemoteApiAddress的COM版本的DLL&#xff0c;在E语言下用类库封装后调用时,对64位地址解析…

4.http模块

http模块是Node.js官方提供创建web服务器的模块&#xff0c;在使用http模块前首先导入http模块 目录 1 一些概念 1.1 IP 1.2 域名 1.3 端口 2 创建一个基本的web服务器 3 req请求对象 4 res响应对象 5 不同地址获取不同响应 6 在服务中加载html文件 6.1 基…

vsomeip 快速入门

vsomeip 快速入门 文章目录vsomeip 快速入门1. 下载仓库2. 编译2.1 安装相关依赖2.2 编译vsomeip2.3 编译hello_world example3. 运行1. 下载仓库 git clone https://github.com/COVESA/vsomeip.git2. 编译 2.1 安装相关依赖 我的ubuntu 版本是20.04&#xff0c;所以以ubunt…