浅析深浅拷贝

news2024/12/23 8:26:53

       我们在对对象进行复制时就用到深浅拷贝。

一、普通复制

<script>
    const people={
        name:'tim',
        age:22
    }
    const test=people;
    console.log(test);//tim 22
    test.age=20;
    console.log(test);//tim 20
    console.log(people);//tim 20
</script>

控制台打印结果: 

     

       之所以我们要用到拷贝,是因为直接赋值的复制可能不能满足我们的需求。向上面代码所展示的,我们复制代码时,复制到的是地址,所以对复制体修改实际修改的是原对象的值,这个时候我们再对对象进行复制的意义就不大了。

二、浅拷贝

        浅拷贝是创建一个新的对象,但只复制原对象的第一层属性,如果原对象的属性是基本类型,那么复制的是值,在对复制体进行更改不会改变原对象的值;如果原对象的属性是引用类型,那么复制的是地址,复制的对象改变改变的就是地址里的内容,原对象内容也会改变。

浅拷贝方法:

  • 方法1:Object.assign(目标文件,原文件)
  • 方法2:const 目标文件={...原文件}

    拷贝数组:

           方法1:Array.prototype.concat()

          方式2:[...arr]

代码演示:

<script>
    const people={
        name:'tim',
        age:22,
        student:{
            student:'cc'
        }
    }
    //方法1
    //const test= {...people};
    //方法2
    const test= {};
    Object.assign(test,people);

    console.log(test);//tim 22 cc
    test.age=20;
    test.student.student='bb';
    console.log(test);//tim 20 bb
    console.log(people);//tim 22 bb
</script>

控制台打印结果:  

三、深拷贝

       深拷贝是创建一个新的对象,并递归地复制原对象的所有层级的属性,无论原对象的属性是基本类型还是引用类型,都会复制其实际的值,深拷贝后两个对象完全独立,互不影响。

深拷贝的方法:

1、递归实现

<script>
    const people = {
        name: 'tim',
        age: 22,
        student: {
            student: 'cc'
        }
    }
    const test = {};
    //拷贝函数
    function deepCopy(newObj,oldObj) {
        for(let k in oldObj){
            if(oldObj[k] instanceof Array){
                newObj[k]=[];
                deepCopy(newObj[k],oldObj[k]);
            }else if(oldObj[k] instanceof Object) {
                newObj[k]={};
                deepCopy(newObj[k],oldObj[k]);
            } else{
                newObj[k]=oldObj[k];
            }
        }
    }
   deepCopy(test,people);
    console.log(test);
    test.student.student = 'bb';
    console.log(test);
    console.log(people);
</script>

2、使用js库lodash里面cloneDeep内部实现

<script src="https://cdn.jsdelivr.net/lodash/4.17.21/lodash.min.js"></script>
<script>
    const people = {
        name: 'tim',
        age: 22,
        student: {
            student: 'cc'
        }
    };

    const test = _.cloneDeep(people);

    console.log(test);
    test.student.student = 'bb';
    console.log(test);
    console.log(people);
</script>

3、利用JOSN字符串转换

<script>
    const people = {
        name: 'tim',
        age: 22,
        student: {
            student: 'cc'
        }
    }
    //转换为字符串JSON.stringify(people);
    //再转换为对象
    const test = JSON.parse(JSON.stringify(people));
    console.log(test);
    test.student.student = 'bb';
    console.log(test);
    console.log(people);
</script>

 控制台打印结果: 

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

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

相关文章

使用struct解析通达信本地Lday日线数据

★★★★★博文原创不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习编程小技巧&#xff0c;喜欢的老铁可以多多帮忙点赞&#xff0c;小红牛在此表示感谢。★★★★★ 在Python中&#xff0c;struct模块提供了二进制数据的打包和解包…

使用transformers生成文本Generating text with transformers

到目前为止&#xff0c;您已经看到了Transformers架构内部的一些主要组件的高级概述。但您还没有看到从头到尾的整体预测过程是如何工作的。让我们通过一个简单的例子来了解。在这个例子中&#xff0c;您将查看一个翻译任务或一个序列到序列的任务&#xff0c;这恰好是Transfor…

破解难题:如何应对项目中的‘老油条’障碍

引言 在项目管理的实践中&#xff0c;我们经常遇到各种各样的人员挑战。其中&#xff0c;有一种特殊的挑战被称为“老油条”现象。这些“老油条”通常在表面上表现得非常配合&#xff0c;但在实际工作中却常常没有任何进展。这种情况不仅会影响项目的进度&#xff0c;还可能对…

机器学习---常见的距离公式(欧氏距离、曼哈顿距离、标准化欧式距离、余弦距离、杰卡德距离、马氏距离、切比雪夫距离、闵可夫斯基距离、K-L散度)

1. 欧氏距离 欧几里得度量&#xff08;euclidean metric&#xff09;&#xff08;也称欧氏距离&#xff09;是一个通常采用的距离定义&#xff0c;指在m维空 间中两个点之间的真实距离&#xff0c;或者向量的自然长度&#xff08;即该点到原点的距离&#xff09;。在二维和三维…

Spring(16) Aware结尾的类整理

目录 一、什么是 Aware 结尾的类&#xff1f;二、常见的 Aware 实现接口三、Aware 实现原理 一、什么是 Aware 结尾的类&#xff1f; 在 Spring Boot 中&#xff0c;以 Aware 结尾的类通常是一些继承了 Aware 接口的接口类&#xff0c;它们用于使 Bean 获取某些特定的能力或资…

AJAX的POST请求在chrome浏览器报net::ERR_CONNECTION_RESET问题

背景说明 公司对前端的所有的AJAX请求做了统一的封装&#xff0c;因此业务上需要发起请求调用后端服务时&#xff0c;使用的都是公司封装好的工具。 由于ERR_CONNECTION_RESET问题比较粗&#xff0c;也就是说可能会有很多原因会导致浏览器报这个错&#xff0c;因此在网上可以…

clion软件ide的安装和环境配置@ubuntu

1.官网&#xff1a; Download CLion 2.安装Clion 直接在官网下载并安装即可&#xff0c;过程很简单 https://www.jetbrains.com/clion/ https://www.jetbrains.com/clion/download/#sectionlinux 3.激活码 4.配置Clion 安装gcc、g、make Ubuntu中用到的编译工具是gcc©…

Java面向对象——多态、Object类、instanceof关键字以及final关键字

多态的概念 1.多态是指同一个方法调用可以在不同的对象上有不同的表现&#xff0c;即同一种方法调用方式适用于不同的数据类型。 编译时和运行时&#xff1a;编译时期调用的是父类中的方法&#xff0c;但运行时期会根据实际的对象类型来调用适当的方法。这种行为称为动态绑定&…

自注意力机制简介Transformers: Attention is all you need

“Attention is All You Need” 是一篇由Google研究人员在2017年发表的研究论文&#xff0c;该论文介绍了Transformer模型&#xff0c;这是一种革命性的架构&#xff0c;它彻底改变了自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并成为我们现在所知道的LLMs的基础…

剪枝基础与实战(1): 概述

本文介绍基于L1正则化的剪枝原理,并以VGG网络进行实战说明。将从零详细介绍模型训练、稀疏化、剪枝、finetune的全过程,提供详细的源码及说明,有助于对剪枝的熟练掌握,后续也会对yolov8进行剪枝的介绍。 论文: Learning Efficient Convolutional Networks through Network …

学习笔记|基于Delay实现的LED闪烁|模块化编程|SOS求救灯光|STC32G单片机视频开发教程(冲哥)|第六集(下):实现LED闪烁

文章目录 2 函数的使用1.函数定义&#xff08;需要带类型&#xff09;2.函数声明&#xff08;需要带类型&#xff09;3.函数调用 3 新建文件&#xff0c;使用模块化编程新建xxx.c和xxx.h文件xxx.h格式&#xff1a;调用头文件验证代码调用&#xff1a;完整的文件结构如下&#x…

PyTorch学习笔记(十七)——完整的模型验证(测试,demo)套路

完整代码&#xff1a; import torch import torchvision from PIL import Image from torch import nnimage_path "../imgs/dog.png" image Image.open(image_path) print(image)# 因为png格式是四个通道&#xff0c;除了RGB三通道外&#xff0c;还有一个透明度通…

利用“病毒制造机”实现脚本病毒的制造

一、脚本病毒的概念&#xff1a; 脚本病毒通常是 JavaScript 或 VBScript 等语言编写的恶意代码&#xff0c;一般广告性质&#xff0c;会修改 IE 首页、修改注册表等信息&#xff0c;对用户计算机造成破坏。 通过网页进行的传播的病毒较为典型&#xff0c;脚本病毒还会有如下前…

【LeetCode-中等题】128. 最长连续序列

题目 题解一&#xff1a;HeshSet枚举 思路&#xff1a;先对数组进行set去重&#xff0c;核心就是&#xff0c;先找出临界值&#xff08;假设以最小临界为例&#xff0c;那么这个临界值自己就是最小值&#xff0c;&#xff09;&#xff0c;以临界值不断做加1操作&#xff0c;看…

Kotlin 使用 View Binding

解决的问题&#xff1a; 《第一行代码——Android》第三版 郭霖 P277 视图绑定的问题 描述&#xff1a; kotlin-android-extensions 插件已经弃用 butter knife 已经弃用 解决办法 推荐使用 View Binding 来代替 findViewById 使用方法 1、配置 build.gradle 2、在act…

【MySQL系列】SQL语句入门(创建删除操作)、字符集和数据类型详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Docker安装并配置镜像加速器,镜像、容器的基本操作

目录 1.安装docker服务&#xff0c;配置镜像加速器 &#xff08;1&#xff09;安装依赖的软件包 &#xff08;2&#xff09;设置yum源&#xff0c;我配置的阿里仓库 &#xff08;3&#xff09;选择一个版本安装 &#xff08;4&#xff09;启动docker服务&#xff0c;并设置…

WaSender 3.0 全功能版--Crack

WaSender – Is Windows software which runs on PC, a solution to automatically send messages to your bulk customers and Groups.​ Features:- Unlimited WhatsApp Messages to Contact / Numbers Send messages to all contacts including contacts not saved in your…

C#面向对象程序设计之变量的作用域,深入浅出 入门和进阶教程3

1、效果镇楼: 最近忒忙了!真的忙到不可开交的呢,繁杂业务的处理真的不是您,我个人想象的样子,完全比您个人想象的要复杂至少三倍以上的难度!也是客观事实。 菜鸟程序员面临的客观残酷现实!尤其您这个年龄阶段,实在是堪忧,尴尬的很啊,非常严峻的形势,也可以说特别严峻…

docker导出、导入镜像

导出镜像到本地&#xff0c;然后可以通过压缩包的方式传输。 导出&#xff1a;docker image save 镜像名:版本号 > /home/quxiao/javatest.tgz 导入&#xff1a;docker image load -i /home/quxiao/javatest.tgz 删除镜像就得先删除容器&#xff0c;当你每运行一次镜像&…