js深浅拷贝:保证赋值后改变第二个变量的值,不影响第一个变量的值

news2025/7/12 7:45:38

  • 对于基本数据来说,将一个变量赋值给另一个变量,第二个变量值改变了,不会影响第一个变量;
  • 但对于复杂类型中的对象来讲,将一个对象赋值给另外一个对象,其实是将放对象内容的地址赋值给了第二个对象,它们指的都是一个内容,当第二个对象把内容改了,那第一个对象指的也是这个内容,那就会造成第一个变量也会被改变;
  • 由此我们有了浅copy和深copy两个概念;
  • 浅拷贝:只能解决复杂类型对象中一级对象的赋值问题;
  • 一级对象指的是:value值只是基本的数据类型,例如:{name:”yiyi“,age:21}这样的;
  • 深拷贝:解决复杂类型的赋值问题;
  • 复杂类型指的是:例如:{name:"yiyi",location:{city:"zr",province:"hn"}}
  • 深浅拷贝都是为了保证赋值时,改变第二个变量的值(赋值号左边),不会影响第一个变量的值(赋值号右边);

1、浅copy:针对一级对象赋值问题的解决办法:

  • for循环遍历法:
<script>
        //一级对象,for循环遍历法:
        var myobj1 = {name:"yiyi",age:21}
        var myobj2 = {}
        for (var i in myobj1){
            myobj2[i] = myobj1[i]
        }
        console.log(myobj2)
        myobj2.name ="linlin"
        console.log("myobj2:",myobj2,"myobj1:",myobj1)
</script>

结果:

  • “...”展开运算符法:
  <script>
        //一级对象,“...”展开运算符法
        var myobj1 = {name:"yiyi",age:21}
        var myobj3 = {...myobj1}
        console.log(myobj3)
        myobj3.name = "dd"
        console.log("myobj3:",myobj3,"myobj1:",myobj1)
  </script>

结果:

2、深copy:针对复杂数据类型

  • 函数递归调用法:
  • 函数递归:函数递归指的是在函数内容嵌套该函数;

(1)当myobj1内容只有对象格式时:

        //复杂对象:递归调用法:
        var myobj1 = {name:"yiyi",location:{city:"zr",
        province:"hn"}}
        var myobj2 = {}
        //封装一个函数
        function deepCopy(o2,o1){
            for(var i in o1){
                //复杂类型的表示方法:o1[i].toString()==="[object Object]"
                if(o1[i].toString()==="[object Object]"){
                    o2[i]={}
                    deepCopy(o2[i],o1[i])
                }else{
                    o2[i]=o1[i]
                }
            }
        }
        deepCopy(myobj2,myobj1)
        console.log(myobj2,myobj1)

结果:

  • 当myobj2改变时,myobj1不会受影响;
  • toString是对象原型上的一个方法;
  • 数组类型的判断方式:

Object.prototype.toString.call(o1[i])==='[object Array]'

  • 复杂对象类型的判断方式:例如:myobj1 = {name:"yiyi",location:{city:"zr",province:"hn"}}

判断方式:Object.prototype.toString.call(o1[i])==="[object Object]"

(2)当myobj1内容既有复杂对象,又有数组格式时:

//复杂对象:递归调用法:
        var myobj1 = {name:"yiyi",location:{city:"zr",
        province:"hn"},horry:["sheying","paizhao","aimei"]}
        var myobj2 = {}
        //封装一个函数
        function deepCopy(o2,o1){
            for(var i in o1){
                //复杂类型的表示方法:o1[i].toString()==="[object Object]"
                if(Object.prototype.toString.call(o1[i])==="[object Object]"){
                    o2[i]={}
                    deepCopy(o2[i],o1[i])
                }else if(Object.prototype.toString.call(o1[i])==='[object Array]'){
                    //数组类型判断方式:Object.prototype.toString.call(o1[i])==='[object Array]'
                    o2[i]=[]//改为数组
                    deepCopy(o2[i],o1[i])
                }else{
                    o2[i]=o1[i]
                }
            }
        }
        deepCopy(myobj2,myobj1)
        console.log(myobj2,myobj1)

结果:

  • JSON.parse(JSON.stringify())法:
        //复杂类型:JSON.parse(JSON.stringify())法:
        var myobj1 = {name:"yiyi",location:{city:"zr",
        province:"hn"},horry:["sheying","paizhao","aimei"],introduction:undefined}

        var myobj2 = JSON.parse(JSON.stringify(myobj1))
        console.log(myobj1,myobj2)

结果:

  • JSON.parse()、JSON.stringify()这个方法可以直接实现赋值而且改变后面一个变量的值时,不会改变前面一个变量的值;
  • 但是缺点是不能赋值undefined值, 就是第一个变量如果有undefined值,将第一个变量赋值给第二个变量时,undefined值赋值不过去,会丢失;

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

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

相关文章

Amazon EKS绑定alb 使用aws-load-balancer-controller(Ingress Controller)对外提供服务

1、创建AWS Load Balancer Controller 的 IAM 策略 亚马逊相关文档 下载地址 打开 策略 点击 创建策略 打开 IAM_Policy.json 复制内容粘贴到 json 点击下一步:标签 然后一直下一步 在下图中名称填写 AWSLoadBalancerControllerIAMPolicy 你也可以自定义名称。然后创建策略。…

尚医通_第11章_医院排班管理和搭建用户系统环境

尚医通_第11章_医院排班管理和搭建用户系统环境 文章目录尚医通_第11章_医院排班管理和搭建用户系统环境第一节、-医院排班管理需求分析一、医院排班管理需求1、页面效果2、接口分析第二节、医院排班管理-科室列表一、科室列表&#xff08;接口&#xff09;1、添加service接口和…

李峋同款爱心代码

李峋爱心代码背景代码运行pycharm打包成exe程序背景 最近大火的电视剧《点燃我温暖你》出现&#xff0c;令我的家庭地位进一步下降&#xff0c;因为男主“李峋”已经变成了她的大老公&#xff0c;而我就被打入冷宫. 为了满足她的“攀比心”&#xff0c;我连夜给她实现了粉红色爱…

第十节:多态【java】

目录 &#x1f340;1.多态 &#x1f4d6;1.1 多态的概念 &#x1f4d2;1.2 多态实现条件 &#x1f446;1.2.1向上转型 &#x1f4af;1.2.2重写 &#x1f531;1.2.3动态绑定和静态绑定 &#x1f308;1.2.4多态的应用 &#x1f447;1.2.5向下转型 &#x1f4d5;1.3多态的…

Java岗面试核心NIO有关知识总结

这篇文章主要是阅读了一些关于NIO的文章&#xff0c;对一些重要的部分进行了摘取总结。BIO、NIO、AIO的不同 BIO&#xff1a;同步阻塞IO模式&#xff0c;线程发起IO请求后&#xff0c;一直阻塞IO&#xff0c;直到缓冲区数据就绪后&#xff0c;再进行下一步操作。NIO&#xff1a…

SpringCloud基础知识【Hystrix熔断器】

SpringCloud基础知识【Hystrix熔断器】1. Hystrix概述2. Hystix-隔离2.1 线程池隔离2.2 信号量隔离2.3 Hystix隔离小结3. Hystix-降级3.1 服务提供方降级3.2 消费方降级3.3 Hystix降级小结4. Hystix-熔断4.1 代码演示4.1 熔断监控5. Hystix-限流1. Hystrix概述 Hystix&#xf…

基于概率距离削减法、蒙特卡洛削减法的风光场景不确定性削减(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

一文带你吃透数据库的约束,不做CRUD程序员

在SQL标准中&#xff0c;一共规定了6种不同的约束&#xff0c;包括非空约束&#xff0c;唯一约束和检查约束等&#xff0c;而在MySQL中是不支持检查约束的&#xff0c;所以这篇文章先对其余5种约束做一个详解和练习。 文章目录1. 约束的概念2. 约束的分类3. 非空约束4. 唯一约束…

.net 大型物流综合管理网络平台源码【免费分享】

淘源码&#xff1a;国内专业的免费源码下载平台 源码分享&#xff0c;需要源码学习可私信我&#xff01; 一、源码描述 这是一款大型的物流综合管理网络平台源码&#xff0c;十分完整实用&#xff0c;便于调试&#xff0c;涵盖了物流综合管理的全面内容&#xff0c;该源码运行比…

单商户商城系统功能拆解30—营销中心—积分签到

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

【负荷预测】基于改进灰狼算法(IGWO)优化的LSSVM进行负荷预测(Matlab代码实现)

&#x1f4dd;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;…

IDEA 中Git 多次 Commit 合并为一次提交

一、背景 由于个人习惯的原因&#xff0c;喜欢一个功能分多次提交&#xff0c;导致很多提交比较零碎。 有时候经常需要将零碎的提交合并成一次&#xff0c;该怎么办&#xff1f; 可以使用 IDEA 自带的 Git 插件 将多次 Commit 合并成一次。 二、问题描述 如希望将第二次到第…

新品上市 | “电子表格软件”轻装上阵,企业报表用户的新选择

2022年11月14日&#xff0c;恰逢思迈特软件11周年的生日&#xff0c;我们更新了电子表格软件&#xff08;Smartbi Spreadsheet&#xff09;&#xff0c;希望在一站式BI产品之外&#xff0c;更多的企业用户可以通过成熟、可控、小巧、灵活的报表工具&#xff0c;提升数据化管理的…

分击合进,锦江之星酒店与白玉兰酒店再领投资热潮

2022年11月11日&#xff0c;「山水画中游&#xff0c;暇享好时光」品牌品鉴会在广西桂林隆重召开。锦江酒店&#xff08;中国区&#xff09;旗下两大酒店品牌锦江之星酒店和白玉兰酒店携手亮相本次活动。 &#xff08;品牌矩阵品鉴会活动现场&#xff09; 后疫情时代&#xff…

JDBC编程的基本流程

文章目录1、创建数据源2、让代码和数据源建立连接3、操作数据库3.1 插入操作3.2 删除操作3.3 修改操作3.4 查找操作1、创建数据源 创建DataSource对象&#xff0c;这个对象描述了数据库服务器在哪&#xff0c;需要导入包javax.sql.DataSource DataSource databases new Mysq…

【第006篇】通过impdp命令导入dmp文件到Oracle11g数据库中

准备&#xff1a;按照dmp文件的账号密码&#xff0c;如 gwpc/gwpc 创建好表空间、用户等信息。 1、执行以下命令获取DATA_PUMP_DIR的值。 select * from dba_directories;2、将上图圈主的那个路径复制出来备用&#xff1a;/opt/oracle/app/admin/orcl/dpdump/ 3、将dmp文件放…

3.35 OrCAD中怎么产生Cadence Allegro的第一方网表?OrCAD软件输出Cadence Allegro第一方网表报错时应该怎么处理?

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

从0开始搭建ELK日志收集系统

Elasticsearch elasticsearch是一个高度可扩展全文搜索和分析引擎&#xff0c;基于Apache Lucene 构建&#xff0c;能对大容量的数据进行接近实时的存储、搜索和分析操作&#xff0c;可以处理大规模日志数据&#xff0c;比如Nginx、Tomcat、系统日志等功能。 Logstash 数据收…

一周侃 | 周末随笔

前言 明天又是周一了&#xff0c;感慨时间过得真快&#xff0c;2022年只差一个月就要过去了。大家年初定的目标实现了吗【狗头】 作为一个技术类博主&#xff0c;我平常除了看专业书籍和论文之外&#xff0c;很喜欢看一些闲书&#xff0c;比如时政类、经济类、历史人文类、科…

linux 进程通信 C程序案例

linux 进程通信 C程序案例 编写C程序完成&#xff1a;父进程创建两个子进程&#xff0c;每个进程都在屏幕上显示自己的进程ID号&#xff0c;并在第1个子进程中加载执行一条外部命令。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #inc…