当前位置: 首页 > news >正文

深、浅拷贝之间的关系

深、浅拷贝之间的关系

什么是赋值

赋值是将某一数值或对象赋给某个变量的过程,分为下面 2 部分

  • 基本数据类型:赋值,赋值之后两个变量互不影响
  • 引用数据类型:赋,两个变量具有相同的引用,指向同一个对象,相互之间有影响
//所以赋值操作是直接把一个变量交给另一个变量
const a = 1;
const b = a;//这里赋值是将栈内存的值直接给新变量
const x = {name: '111'};
const y = x;//这里赋值,赋的是引用对象的地址栈的值存的是堆内存的地址

什么是浅拷贝

可以简单理解为新创建一个变量用来拷贝目标变量,并且只解决第一层问题,如果浅拷贝是基本类型数据,直接赋值,如果是引用类型数据,则对其第一层进行赋值操作,即拷贝第一层的基本类型值,以及第一层的引用类型地址

如何实现

  • Object.assign()

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

let a = {name: "zw",book: {title: "You Don't Know JS",price: "45"}
}
let b = Object.assign({}, a);
console.log(b);
// {
// 	name: "zw",
// 	book: {title: "You Don't Know JS", price: "45"}
// } a.name = "change";//这里只改变了a变量栈内存中的值,不会影响b变量
a.book.price = "55";//这里则直接改了两个变量中共同指向的book的堆内存地址中的值
console.log(a);
// {
// 	name: "change",
// 	book: {title: "You Don't Know JS", price: "55"}
// } console.log(b);
// {
// 	name: "zw",
// 	book: {title: "You Don't Know JS", price: "55"}
// } 
  • 扩展运算符Spread
let b = {...a};//对a进行扩展,并放入新的对象中,效果域asign一样
  • Array.prototype.slice()

slice() 方法返回一个新的数组对象,这一对象是一个由 beginend(不包括end)决定的原数组的浅拷贝。原始数组不会被改变。

// 木易杨
let a = [0, "1", [2, 3]];
let b = a.slice(1);
console.log(b);
// ["1", [2, 3]]a[1] = "99";
a[2][0] = 4;//要牢记,浅拷贝只赋值第一层,如果第一层有引用类型数据,则它的改变会导致原对象中该值的改变
console.log(a);
// [0, "99", [4, 3]]console.log(b);
//  ["1", [4, 3]]

什么是深拷贝

深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。拷贝前后两个对象互不影响。

实现深拷贝的方法:

1.递归实现深拷贝:

    <script>let obj = {name: 'zw',number: [10, 20],fn: function () {console.log(123);},old: {one: '1',two: "2"}}// 说明一个函数function copy(obj) {var newobj = null;//通过typeof判断是否为引用数据类型且不等于null//如果等于null直接返回newobjif (typeof (obj) === 'object' && obj !== null) {newobj = obj instanceof Array ? [] : {}//这里创建一个新的引用数据类型用以合并和存放解析后的数据//newobj = obj.isArray(obj)?[]:{};for (const key in obj) {newobj[key] = copy(obj[key])//递归实现对每一个引用数据类型解析并赋值给一个新创建的引用数据类型}}else {newobj = obj;//当解析到基本数据类型时即可以直接赋值。}return newobj;}let a = new copy(obj)a.number[0] = 555console.log(obj);console.log(a);</script>

核心思想:引用数据类型是有基本数据类型构成的,并且,基本数据类型是不存在深浅拷贝这一说的,那么我们只需要将引用数据类型的每一层次的基本数据类型赋值,并遍历到最深处的基本数据并赋值就可以完成深拷贝。

2.通过JSON的方法

const a = JSON.parse(JSON.stringify(数据))
//JSON.stringify(需要拷贝数据)转化为JSON字符串
//JSON.parse(JSON字符串) 将JSON数据格式的字符串转化为对象

相关文章:

深、浅拷贝之间的关系

深、浅拷贝之间的关系 什么是赋值 赋值是将某一数值或对象赋给某个变量的过程&#xff0c;分为下面 2 部分 基本数据类型&#xff1a;赋值&#xff0c;赋值之后两个变量互不影响引用数据类型&#xff1a;赋址&#xff0c;两个变量具有相同的引用&#xff0c;指向同一个对象&…...

服务器数据恢复-某银行服务器硬盘数据恢复案例

服务器故障&分析&#xff1a; 某银行的某一业务模块崩溃&#xff0c;无法正常使用。排查服务器故障&#xff0c;发现运行该业务模块的服务器中多块硬盘离线&#xff0c;导致上层应用崩溃。 故障服务器内多块硬盘掉线&#xff0c;硬盘掉线数量超过服务器raid阵列冗余级别所允…...

仪器器材经营小程序商城的作用是什么

互联网发展下&#xff0c;数字化转型已经成为常态&#xff0c;仅依赖传统线下经营模式将很难再增长。 作为产品销售及客户维护度高的仪器器材行业&#xff0c;拥有自营商城平台是必要的&#xff0c;不仅可以解决以上难题&#xff0c;还利于打造自身品牌多渠道传播&#xff0c;…...

京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!

鲸参谋监测的京东平台9月份洗烘套装市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年9月份&#xff0c;京东平台洗烘套装的销量为7100&#xff0c;环比下降约37%&#xff0c;同比增长约87%&#xff1b;销售额为6000万&#xff0c;环比下降约48%&#…...

论文阅读-多目标强化学习-envelope MOQ-learning

introduction 一种多目标强化学习算法&#xff0c;来自2019 Nips《A Generalized Algorithm for Multi-Objective Reinforcement Learning and Policy Adaptation》本文引用代码全部来源于论文中的链接。主要参考run_e3c_double.py文件 1 总体思想 1.将输入中加入多目标的偏…...

【原创】【考法总结】指针*与++结合的题目考法总结

代码均已调试出结果&#xff0c;放心食用&#xff0c;大致总共5种考法 【理论铺垫】①a[i]恒等价于(ai)即*(&a[0]i)&#xff1b;i类似偏移量&#xff08;别忘a代表数组首元素地址即&a[0]&#xff09; ②*(&a[i])恒等价于a[i]&#xff1a;&a[i]表示a[i]的地址&a…...

react dispatch不生效的坑

一、前言 最近写react antd项目&#xff0c;在A页面中使用了dispatch方法&#xff0c;然后B页面中嵌套A页面&#xff0c;没有问题&#xff1b; 但是在C页面中嵌套A页面的时候&#xff0c;就发现dispatch方法没有执行&#xff0c;也不报错&#xff0c;就很奇怪&#xff1b; 还…...

Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly

安装c语言编译器的时候&#xff0c;老是出现The file has been downloaded incorrectly&#xff0c;真的让人 直接去官网拿压缩包&#xff1a;https://sourceforge.net/projects/mingw-w64/files/ &#xff08;往下拉找到那个x86_64-win32-seh的链接&#xff0c;点击后会自动…...

OpenGL —— 2.6、绘制一个正方体并贴图(附源码,glfw+glad)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库&#xff0c;该库只有一个头文件。 具体代码&#xff1a; vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _viewMatrix; u…...

JavaWeb从入门到起飞笔记——导学课程

学完这一节&#xff0c;我不知道学Web开发究竟能干什么&#xff1f;你知道吗&#xff1f; 以下是黑马程序员Java从入门到起飞的笔记 一、学完Javaweb能干什么&#xff1f; 学完Java后我们可以独立开发一些后台管理系统&#xff0c;例如CRMER器&#xff0c;京东和淘宝&#x…...

【LeetCode:1402. 做菜顺序 | 动态规划 + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

基于FPGA的图像拉普拉斯变换实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a vivado2019.2 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 202…...

高校教务系统登录页面JS分析——巢湖学院

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…...

人工智能、机器学习、深度学习的区别

人工智能涵盖范围最广&#xff0c;它包含了机器学习&#xff1b;而机器学习是人工智能的重要研究内容&#xff0c;它又包含了深度学习。 人工智能&#xff08;AI&#xff09; 人工智能是一门以计算机科学为基础&#xff0c;融合了数学、神经学、心理学、控制学等多个科目的交…...

Element Plus el-select选择框失去焦点blur

正常情况下&#xff0c;可以使用 el-select 自带的方法 blur 事件来使select失去焦点 示例&#xff1a; <el-select v-model"value" ref"selectRef"><el-optionv-for"item in options":key"item.value":label"item.la…...

Java File与IO流学习笔记

内存中存放的都是临时数据&#xff0c;但是在断电或者程序终止时都会丢失 而硬盘则可以长久存储数据&#xff0c;即使断电&#xff0c;程序终止&#xff0c;也不会丢失 File File是java.io.包下的类&#xff0c;File类的对象&#xff0c;用于代表当前操作系统的文件(可以是文…...

LabVIEW中PID控制的的高级功能

LabVIEW中PID控制的的高级功能 比例-积分-微分&#xff08;PID&#xff09;控制占当今控制和自动化应用的90%以上&#xff0c;主要是因为它是一种有效且简单的解决方案。虽然PID算法最初用于线性、时不变系统&#xff0c;但现在已经发展到控制具有复杂动力学的系统。在现实世界…...

STM32基于HAL库RT-Thread Demo测试

STM32基于HAL库RT-Thread Demo测试 &#x1f388;源码地址&#xff1a;https://github.com/RT-Thread/rt-thread/tree/master&#x1f4cc;基于STM32CUBEMX中间件安装《基于 CubeMX 移植 RT-Thread Nano》&#x1f4cd;环境搭建《使用 Env 创建 RT-Thread 项目工程》&#x1f5…...

萌新小白必做题(2)找素数

一.思路分析 先来看看素数的性质&#xff1a; 素数又称质数&#xff0c;是指除了1和本身外没有其它因数的自然数。素数有许多有趣的性质和应用&#xff0c;例如可以用于加密算法和数学证明等。比如2、3、5、7等都是素数&#xff0c;而4、6、8、9等则不是素数。素数的研究是数…...

《基于 Vue 组件库 的 Webpack5 配置》8.在生成打包文件之前清空 output(dist) 目录(两种方式)

方式一 ​ 如果 webpack 是 v5.20.0&#xff0c;直接使用属性 output.clean&#xff0c;配置如下&#xff1a; module.exports {//...output: {clean: true}, };方式二 如果使用较低版本&#xff0c;可以使用插件 clean-webpack-plugin&#xff1a; 先安装&#xff1a;npm…...

终极解决方案:如何快速重置Cursor AI编辑器免费试用期

终极解决方案&#xff1a;如何快速重置Cursor AI编辑器免费试用期 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Your request has been blocked as our system has detected suspicious activity / Youve reached your trial request limit. …...

从《Allergy》到《Queencard》:解码K-POP背后的女性成长叙事

1. 从《Allergy》到《Queencard》&#xff1a;一场关于女性自我认同的视觉叙事 第一次听到《Queencard》那魔性的副歌时&#xff0c;我和大多数人一样&#xff0c;以为这不过是又一首典型的K-POP洗脑神曲。直到偶然点开弹幕里提到的"连续剧式MV"&#xff0c;才意识到…...

电机控制入门:5分钟搞懂克拉克等幅值变换的数学推导与仿真验证

电机控制中的克拉克变换&#xff1a;从数学推导到仿真验证的完整指南 引言 在电机控制领域&#xff0c;克拉克变换&#xff08;Clark Transformation&#xff09;是一项基础而关键的技术。它能够将三相交流系统中的复杂变量转换为更易处理的两相表示&#xff0c;从而大幅简化控…...

华为HCIP-Datacom备考全攻略:从零基础到高分通关的5个关键步骤

华为HCIP-Datacom零基础通关指南&#xff1a;5步构建高效备考体系 站在数据中心网络技术的职业分水岭上&#xff0c;华为HCIP-Datacom认证已成为众多网络工程师突破职业瓶颈的黄金通行证。不同于普通的技术认证&#xff0c;这套体系不仅考察理论知识记忆&#xff0c;更注重解决…...

如何在5秒内启动并处理30种图像格式?JPEGView的极速图像处理架构解析

如何在5秒内启动并处理30种图像格式&#xff1f;JPEGView的极速图像处理架构解析 【免费下载链接】jpegview Fork of JPEGView by David Kleiner - fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF and TIFF images with a minimal GUI. Basic…...

避开这7个SEO误区:我用Ahrefs工具拯救网站排名的真实案例

避开这7个SEO误区&#xff1a;我用Ahrefs工具拯救网站排名的真实案例 三年前&#xff0c;我的个人博客突然从谷歌第一页消失&#xff0c;日均流量暴跌72%。当时我自认为掌握了SEO的"秘诀"——频繁交换友链、大量堆砌关键词、每日更新短平快内容。直到用Ahrefs跑完完整…...

技术深度评测:PPTist如何重塑Web端演示文稿创作体验

技术深度评测&#xff1a;PPTist如何重塑Web端演示文稿创作体验 【免费下载链接】PPTist PowerPoint-ist&#xff08;/pauəpɔintist/&#xff09;, An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for …...

ZotCard:从文献碎片到知识体系的Zotero卡片笔记革命

ZotCard&#xff1a;从文献碎片到知识体系的Zotero卡片笔记革命 【免费下载链接】zotcard ZotCard is a plug-in for Zotero, which is a card note-taking enhancement tool. It provides card templates (such as concept card, character card, golden sentence card, etc.,…...

Python爬虫实战:手把手教你园林植物百科全自动化采集与结构化工程实践!

㊗️本期内容已收录至专栏《Python爬虫实战》&#xff0c;持续完善知识体系与项目实战&#xff0c;建议先订阅收藏&#xff0c;后续查阅更方便&#xff5e; ㊙️本期爬虫难度指数&#xff1a;⭐ (基础入门篇) &#x1f250;福利&#xff1a; 一次订阅后&#xff0c;专栏内的所有…...

Go语言的sync.RWMutex项目优化

Go语言中的sync.RWMutex是并发编程中常用的读写锁&#xff0c;它允许多个读操作同时进行&#xff0c;但写操作是独占的。在高并发场景下&#xff0c;RWMutex的性能直接影响程序的吞吐量。近年来&#xff0c;社区针对RWMutex进行了多项优化&#xff0c;显著提升了其性能表现。本…...