JS的深拷贝和浅拷贝

‍本文作者是360奇舞团开发工程师

数据类型的数据存储

在讨论深拷贝和浅拷贝之前,先来了解下Js基本数据和引用数据类型的存储问题

  • 基本数据类型:Number String Boolean Undefined Symbol Null

  • 引用类型 :Object,function,Array等

基本数据类型的值存放在栈中,在栈中存放的是对应的值;引用类型对应的值存放在堆中,在栈中存放的是指向堆内存的地址,
下面看下数据的赋值过程

  • 基本数据类型赋值是生成相同的值,两个存放在不同地址;

  • 引用类型赋值,是将对象的内存地址赋值到另一个对象,两个变量指向堆内存中同一个对象

基本数据类型的赋值过程

let t1 = 66
let t2 =t1
t1= 88
console.log("t1="+t1+"\t t2="+t2)
输出:
t1=88    t2=66

c4c0461bcb9accb13c9f4cf0f1fa3e47.png

引用类型的赋值过程

let  obj1={name:"张三",age:6}
let obj2 = obj1
obj1.name="zhangsan"
console.log("obj1="+JSON.stringify(obj1)+"\t obj2="+JSON.stringify(obj2))
输出:
obj1={"name":"zhangsan","age":6}         obj2={"name":"zhangsan","age":6}

df9667f1b77bf92fd184801d3d97b4b3.png

深拷贝和浅拷贝

了解了数据类型的存储类型,那么深拷贝和浅拷贝就容易理解了

浅拷贝

浅拷贝:指的是创建新的数据,这个数据和原始数据相同,如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址

代码实现一个浅拷贝

function shallowCopy(obj) {let newObject ={}for (let key in obj) {if(obj.hasOwnProperty(key)){newObject[key] = obj[key]}}return newObject
}
let  p={name:"zhangsan",hobby:{playTime:"12年"}
}let p1 = shallowCopy(p)
console.log("p1="+JSON.stringify(p1))
console.log("p=" + JSON.stringify(p))
p.hobby.playTime = "16年"
p.name="李四"
console.log("p1=" + JSON.stringify(p1))
console.log("p=" + JSON.stringify(p))
输出:
p1={"name":"zhangsan","hobby":{"playTime":"12年"}}
p={"name":"zhangsan","hobby":{"playTime":"12年"}}
p1={"name":"zhangsan","hobby":{"playTime":"16年"}}
p={"name":"李四","hobby":{"playTime":"16年"}}

深拷贝

深拷贝是开辟一个新的栈,两个对象完全相同,但是对应两个不同地址,修改任一对象不会影响另一个对象

代码实现一个深拷贝

let p = {name: "zhangsan",hobby: {playTime: "12年"}
}
function deepCopy(obj) {if(obj == null) return objif (obj instanceof Date) return new Date(obj)if( obj instanceof RegExp) return RegExp(obj)if(typeof obj !="object") return objlet  targetObj ={}for (let key in obj) {if(obj.hasOwnProperty(key)){targetObj[key] = deepCopy(obj[key])}}return targetObj
}
let  p1=deepCopy(p)
console.log("p1=" + JSON.stringify(p1))
console.log("p=" + JSON.stringify(p))
p.hobby.playTime = "16年"
p.name = "李四"
console.log("p1=" + JSON.stringify(p1))
console.log("p=" + JSON.stringify(p))
输出:
p1={"name":"zhangsan","hobby":{"playTime":"12年"}}
p={"name":"zhangsan","hobby":{"playTime":"12年"}}
p1={"name":"zhangsan","hobby":{"playTime":"12年"}}
p={"name":"李四","hobby":{"playTime":"16年"}}

深拷贝和浅拷贝的区别

深拷贝和浅拷贝都创建出一个对象,但是拷贝对象属性的时候行为不一样,浅拷贝只复制指针,两个对象仍然共用一块内存,所以修改会相互影响;深拷贝出来的对象与原对象一模一样,但是不共用一块空间,修改互不影响

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

7096355007012d8f57e18ffe32508d04.png

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

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

相关文章

ChatGPT:深度学习和机器学习的知识桥梁

目录 ChatGPT简介 ChatGPT的特点 ChatGPT的应用领域 ChatGPT的工作原理 与ChatGPT的交互 ChatGPT的优势 ChatGPT在机器学习中的应用 ChatGPT在深度学习中的应用 总结 近年来,随着深度学习技术的不断发展,自然语言处理技术也取得了显著的进步。其…

lnmp环境搭建

文章目录 一、环境信息二、LNMP环境搭建2.1 准备编译环境2.2 nginx安装2.3 mysql安装2.4 php安装2.5 nginx配置2.6 mysql配置2.7 配置php 三、常见问题3.1 安装其它版本的nginx服务3.2 php版本过低 一、环境信息 操作系统:公共镜像CentOS 7.8 64位 本文的部署配置…

Bean 的生命周期总结

目录 一、Bean生命周期的五个阶段 Bean的初始化 二、PostConstruct 和 PreDestroy 各自的效果 三、 实例化和初始化的区别 四、为什么要先设置属性在进⾏初始化呢? 一、Bean生命周期的五个阶段 Java 中的公共类称之为 Bean 或 Java Bean,而 Spring 中的…

golang中给数据库datetime格式赋值

type A struct {CreateTime *time.Time gorm:"create_time" } 1、定义数据库表映射结构体如上,create_time字段在表里面是datetime格式。 2、如果CreateTime不给值,在存库时,create_time字段的值为NULL。 3、赋值时,…

STM32F4X RNG随机数发生器

STM32F4X RNG随机数发生器 随机数的作用STM32F4X 随机数发生器RNG控制寄存器RNG状态寄存器RNG数据寄存器RNG数据步骤RNG例程 随机数的作用 随机数顾名思义就是随机产生的数字,这种数字最大的特点就是其不确定性,你不知道它下一次产生的数字是什么。随机…

计算机网络-谢希任第八版学习笔记总结

一.计算机网络概述 21世纪三个特点 数字化 信息化 智能化,其中主要是围绕智能化。 网络的常见分类: 电话网络 有线电视网络 计算机网络 互联网:Internet 由数量极大的计算机网络相连接 特点: 共享性 连通性 互联网&…

2023年数模国赛时间分配

2023年数模国赛时间分配 写在前面赛前准备第一天(9.7 18:00发布题目)第二天(9.8)第三天(9.9)第四天(9.10 20:00提交)总结 写在前面 国赛马上就要开始啦 今年的比赛时间是9月7日&…

网络安全-子域名收集

本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 子域名 子域名指二级域名,二级域名是顶级域名(一级域名)的下一级比如mail.heetian.com和bbs.heetian.com…

【深度学习】基于卷积神经网络的铁路信号灯识别方法

基于卷积神经网络的铁路信号灯识别方法 摘 要:1 引言2 卷积神经网络模型2.1 卷积神经网络结构2.2.1 卷积层2.2.2 池化层2.2.3 全连接层 3 卷积神经网络算法实现3.1 数据集制作3.2 卷积神经网络的训练过程3.2.1 前向传播过程 4 实验5 结语 摘 要: 目前中…

系统架构设计师(第二版)学习笔记----系统架构设计师概述

【原文链接】系统架构设计师(第二版)学习笔记----系统架构设计师概述 文章目录 一、架构设计师的定义、职责和任务1.1 架构设计师的定义1.2 架构设计师的任务 二、架构设计师应具备的专业素质2.1 架构设计师应具备的专业知识2.2 架构设计师的知识结构2.3…

Android 集成onenet物联网平台

一,在Android应用程序中集成OneNet物联网平台,您可以按照以下步骤进行操作: 注册OneNet账户:首先,您需要在OneNet官方网站上注册一个账户。访问OneNet网站(https://open.iot.10086.cn/ ↗)&…

Unity UGUI(一)基础组件

文章目录 1.Text:文本框2.Image:精灵图3.RawImage:生图4.Button:按钮5.InputField:输入框6.Tooggle:选择框7.Slider:滑动条8.Dropdown:下拉菜单9.Scrollbar:滚动条10.Scr…

网络威胁防御+资产测绘系统-Golang开发

NIPS-Plus 网络威胁防御资产测绘系统-Golang开发 项目地址:https://github.com/jumppppp/NIPS-Plus NIPS-Plus 是一款使用golang语言开发的网络威胁防御系统(内置资产测绘系统) 网络威胁流量视图网络威胁详细信息浏览列表网络威胁反制探测攻…

CRM 自动化如何改善销售和客户服务?

许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程,使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程,让团队有更多的时间来执行高价值的任务,而不是陷于一堆琐碎事情中。 什么是CRM自动化? CRM 自动化是指 C…

VScode SSH无法免密登录

配置方法 引用高赞贴:点击 debug方法 连不上需要找到问题原因,看ssh的 log Linux服务器:2222是我们指定的端口,可以是1234等 sudo /usr/sbin/sshd -d -p 2222windows这边:端口号要一致 ssh -vvv ubuntusername192…

自然语言处理——数据清洗

一、什么是数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。与问卷审核不同,录入后的数据清理一般是由计算机而不是人工完成。 ——百度百科 二、为什么要数据清洗 现实生…

智能井盖传感器:高效守护城市道路安全

近年来,井盖出问题导致事故的报道时有发生,但却容易被公众所忽视。井盖作为城市基础设施的一部分,主要用于保护下方的供水管道、下水道以及电信线缆等。然而,由于长时间使用、缺乏维护、设计不合理等原因,井盖出现问题…

OpenCV C++案例实战三十三《缺陷检测》

OpenCV C案例实战三十三《缺陷检测》 前言一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型 三、图像配准3.1 功能源码3.1 功能效果 四、多元模板图像4.1 功能源码 五、缺陷检测5.1 功能源码 六、效果演示总结 前言 本案例将使用OpenCV C 进行PCB印刷缺陷检测…

UMA 2 - Unity Multipurpose Avatar☀️一.让UMA角色动起来

文章目录 🟥 项目基础配置1️⃣UMA_DCS 预制体2️⃣创建 UMA 角色🟧 让UMA动起来1️⃣ 新建空场景,添加UMA_DCS预制体2️⃣配置 vBasicController_Template🟥 项目基础配置 1️⃣UMA_DCS 预制体 将 UMA_DCS 预制体放到场景中 2️⃣创建 UMA 角色 创建空物体,添加 Dy…

陪诊系统|陪诊软件开发|陪诊系统搭建功能

为了顺应不断变化的市场需求,有些行业慢慢销声匿迹,有些行业刚刚崭露头角,目前陪诊的市场需求也在逐渐扩大,陪诊小程序也随之到来,主要面向独居老人,孕妇,残障人士等等给予专业性的陪诊就医服务…