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在深度学习中的应用 总结 近年来,随着深度学习技术的不断发展,自然语言处理技术也取得了显著的进步。其…

Bean 的生命周期总结

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

STM32F4X RNG随机数发生器

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

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

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

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

基于卷积神经网络的铁路信号灯识别方法 摘 要: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…

网络威胁防御+资产测绘系统-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…

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

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

结构方程模型SEM、路径分析房价和犯罪率数据、预测智力影响因素可视化2案例...

原文链接:http://tecdat.cn/?p25044 在本文,我们将考虑观察/显示所有变量的模型,以及具有潜在变量的模型(点击文末“阅读原文”获取完整代码数据)。 1 简介 第一种有时称为“路径分析”,而后者有时称为“测…

成都睿趣科技:现在开一家抖音小店还来得及吗

随着社交媒体的迅猛发展,抖音已经成为了一个全球范围内广受欢迎的社交平台。在这个短视频应用上,人们分享着各种各样的内容,从搞笑段子到美食教程,再到时尚搭配和手工艺品制作。随着用户数量的不断增长,很多人都在思考…

【动手学深度学习】--文本预处理

文章目录 文本预处理1.读取数据集2.词元化3.词表4.整合所有功能 文本预处理 学习视频:文本预处理【动手学深度学习v2】 官方笔记:文本预处理 对于序列数据处理问题,在【序列模型】中评估了所需的统计工具和预测时面临的挑战,这…

180B参数的Falcon登顶Hugging Face,最好开源大模型使用体验

文章目录 使用地址使用体验test1:简单喜好类问题使用地址 https://huggingface.co/spaces/tiiuae/falcon-180b-demo 使用体验 相比Falcon-7b,Falcon-180b拥有1800亿的参数量,在智能问答领域做到了Top 1。在回答问题的深度和广度上都明显优于只有70亿参数量的Falcon-7b,并…

【计算机基础知识9】前端设计模式与常见类型

目录 一、前言 二、设计模式的基本概念和原则 三、创建型设计模式 四、结构型设计模式 五、行为型设计模式 六、MVC和MVVM框架中的设计模式 七、实际应用案例分析 一、前言 在软件开发领域,设计模式是一种解决常见问题的最佳实践,它可以帮助开发…

C++ std::pair and std::list \ std::array

std::pair<第一个数据类型, 第二个数据类型> 变量名 例如&#xff1a; std::pair<int, string> myPair; myPair.first;拿到第一个int变量 myPair.second拿到第二个string变量 std::pair需要引入库#include "utility" std::make_pair() 功能制作一个…