·

Vue浅拷贝和深拷贝

Published at 2024-08-29 16:10:37Viewed 237 times
Please reprint with source link

前言

在理解浅拷贝和深拷贝浅前,必须先理解基本数据类型和引用数据类型的区别。

一、数据类型

1.1.基本数据类型

字符串(Sring)、布尔值(Boolean)和数字(Number)

1.2.引用数据类型

数组(Array)和对象(Object)

1.3.区别

基本数据类型是存储在栈内存中。而引用类型存放的值是指向数据的引用,而不是数据本身,真实数据是存放在堆内存里,具体见如下:

二、浅拷贝

2.1. 定义

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

2.2. 浅拷贝特点

对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个。

var a = 10
var b = a
b = 20
console.log("a",a) //10
console.log("b",b) //20

对于引用类型,比如数组或者类对象,因为引用类型是引用传递,所以浅拷贝只是把内存地址赋值给了成员变量,它们指向了同一内存空间。改变其中一个,会对另外一个也产生影响

var obj = {
    a:"AAA"
}
var obj2 = obj
obj2.a = "BBB"
console.log("obj",obj) //{name: "BBB"}
console.log("obj2",obj2) //{name: "BBB"}

三、深拷贝

3.1. 定义

深拷贝,在拷贝引用类型成员变量时,为引用类型的数据成员另辟了一个独立的内存空间,实现真正内容上的拷贝。

3.2. 深拷贝特点

对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个(和浅拷贝一样)。

对于引用类型,比如数组或者类对象,深拷贝会新建一个对象空间,然后拷贝里面的内容,所以它们指向了不同的内存空间。改变其中一个,不会对另外一个也产生影响。

var obj = {
    a:"AAA"
}
var obj2 = {} // 创建新的对象
obj2 = obj
obj2.a = "BBB"
console.log("obj",obj) //{name: "AAA"}
console.log("obj2",obj2) //{name: "BBB"}

四、拷贝实现方案

4.1. Object.assign()

单级结构时深拷贝,多级结构浅拷贝,Object.assign()对象是用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,将返回目标对象。

a)单级结构(一级拷贝是深拷贝):

var obj = {
    a: 10,
}
var obj2 = Object.assign({}, obj);
obj2.a = 20
console.log("obj",obj); //{a: 10}
console.log("obj2",obj2) //{a: 20}

b)多级结构(一级拷贝是浅拷贝,修改二级对象还是会影响原对象):

var obj = {
    a: 10,
    b: {
        c:"AAA",
        d:666
    }
}
var obj2 = Object.assign({}, obj);
obj2.b.c = "BBB"
console.log("obj",obj); //{a: 10,b: {c:"BBB",d:666}}
console.log("obj2",obj2); //{a: 10,b: {c:"BBB",d:666}}

4.2. concat()

单级结构时深拷贝,多级结构浅拷贝

a)单级结构(一级拷贝是深拷贝):

let arr = [1, 2];
let arr2 = arr.concat();
arr2[1] = 3;
console.log("arr",arr) //[1, 2]
console.log("arr2",arr2) //[1, 3]

b)多级结构(一级拷贝是浅拷贝):

let arr = [1, 2, {
    a: 'AAA'
}];
let arr2 = arr.concat();
arr2[2].a = 'BBB';
console.log("arr",arr) //[1, 2, {a: 'BBB'}]
console.log("arr2",arr2) //[1, 2, {a: 'BBB'}]

4.3. slice()

单级结构时深拷贝,多级结构浅拷贝

a)单级结构(一级拷贝是深拷贝):

let arr = [1, 2, 3];
let arr2 = arr.slice();
arr2[1] = 4;
console.log("arr",arr) //[1, 2, 3]
console.log("arr2",arr2) //[1, 4, 3]

b)多级结构(一级拷贝是浅拷贝):

let arr = [1, 2, {a:'AAA'}];
let arr2 = arr.slice();
arr2[2].a = 'BBB';
console.log("arr",arr) //[1, 2, {a: 'BBB'}]
console.log("arr2",arr2) //[1, 2, {a: 'BBB'}]

4.4.JSON.parse(JSON.stringify())

用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。

单级多级均为深拷贝,但需要注意无法拷贝RegExp对象、function和symbol

let arr = [1, 2, {a:'AAA'}];
let arr2 = JSON.parse(JSON.stringify(arr))
arr2[2].a = 'BBB';
console.log("arr",arr) //[1, 2, {a: 'AAA'}]
console.log("arr2",arr2) //[1, 2, {a: 'BBB'}]

4.5. cloneDeep()

单级多级均为深拷贝,使用lodash工具中cloneDeep方法实现深拷贝,需要通过npm引入lodash库

npm i -save lodash //全局安装
<script>
  import _ from 'lodash';

  export default {
    name: 'Test',
    mounted() {
      const arr = [1, 2, { a: 'AAA' }];
      const arr2 = _.cloneDeep(arr);
      arr2[2].a = 'BBB';
      console.log('arr', arr); // [1, 2, {a: 'AAA'}]
      console.log('arr2', arr2); // [1, 2, {a: 'BBB'}]
    },
  };
</script>

五、结论

类型第一级为基础数据类型原数据中包含子对象
浅拷贝改变不会使原始数据改变改变会使原始数据改变
深拷贝改变不会使原始数据改变改变不会使原始数据改变


原文链接:https://blog.csdn.net/ltlt654321/article/details/127047262

0 人喜欢

Comments

There is no comment, let's add the first one.

弦圈热门内容

学基础数学可以相信“勤能补拙”吗?

知乎提问:题主是某985数学系大二,学基础方向,做基础的研究是存在很长时间的追求,很有兴趣。但是大学前期贪玩,在学业上花费时间比较少,除了上课和写作业就基本没花时间在数学上了。所以虽然专业课成绩还好看,但考试成绩没法说明学习水平,我自己明显感觉知识储备非常匮乏。在知乎上看同样学基础的同学们,大一大二甚至高中就学了这样那样的课程,而我大二快毕业了甚至还没系统修过抽象代数,前两年只是在按学校安排的课程按部就班地学。现在想专心学习不要荒废学业,突然就比较焦虑。我高中时没有条件搞竞赛训练,自学考过两次高联,高一40分,高二连市上的预赛都没过。考大学生数学竞赛(专业a)也只能拿30分,数分计算经常算不明白,高代学完很少用,现在基本上忘完。拓扑实变这种课,正常难度的课后习题不看答案自己做得至少三十分钟才能搞定一道,一两个小时是常态,更多的还是不会做。花时间少是一方面,但也感觉自己不是有天赋的人。但我偏偏又走到了今天这条路上。现在很迷茫,当初高考选数学专业是因为一脑子热血,想着人这辈子就应该要向着自己的热爱而奋斗。但现在离本科毕业越来越近,我不得不思考未来的出路。我不知道我这样资质平平的人学基础数学 ...

弦圈更新日志之提问新功能:标记疑惑、提出子问题

今天我熬夜肝出了提问的新功能,分别是标记疑惑和提出子问题。示例可见测试问题:center h1 in the middle of screen和Vertically aligning CSS :before and :after content。我就长话短说简单介绍一下。所谓的子问题,意思是你可以根据原有的一个问题,提出一个更加具体、更加细致的子问题。因为有时候一些问题和回答往往比较宽泛,不是很具体,这时子问题就发挥作用了!而标记疑惑则是你可以标记回答中某个不懂的地方。你可以通过选定回答中的某个语句,然后向答主提出你的疑惑点,答主看到后可以回复你的疑惑。目前标记疑惑还有进一步优化的空间,并且之后计划应用在文章和书上,不仅仅是回答。对了,我还顺带美化了一下提问页面的布局和样式,让它看起来更加舒服顺眼一些。晚安😇

喜欢数学但是不擅长数学竞赛怎么办?非数学竞赛生如何在数学专业生存?

知乎提问:初中根本没有学习,中考以极差的分数去了某末流重点高中(中考分数还没jumping高),高中连数学竞赛名额都没有,高三自学过物理竞赛,因为实验和学习时间短没拿省一,高中基本上没有学过数学竞赛,高考620+考上某985数院,发现周围数学竞赛生非常多,说的东西我根本没有听过,大学数学能学会,别人甚至做了竞赛数论几千道题,我甚至一点都不懂。我的回答:我就从未参加过任何所谓的数学竞赛,我自己也对应试和竞赛本身深恶痛绝,反正是一丁点提不起兴趣。我本身也不是那种应试能力强的人,但这也没影响我的数学水平、科研能力。在纯粹的数学面前,所有学生无论擅长竞赛与非,都一视同仁。会就是会,不会就是不会,有些人参加竞赛比你学得好,可能是别人天赋比较就好,或者就是别人学得比你多,付出的努力比你多,那凭啥不能比你懂。所以答案也显而易见了,题主的这种情况,只能勤能补拙。天赋不如别人好,或者自己比别人学得少、学得慢,但是还是好想学数学,怎么办?其实这都是初学者常常遇见的问题。在我看来,最好的办法就是要学会调整自己的心态,明悟心性,把注意力放回到自己身上,放回到数学本身身上,不要老跟别人比较。说实话像什么别人比我 ...

图灵奖得主写的深度学习入门教材:Deep Learning

这本书是两位图灵奖得主Ian Goodfellow和Yoshua Bengio,以及深度学习专家Aaron Courville写的入门教材。相比于更基础的Aurélien Géron人工智能入门教材:Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow,这本书所需要的基础要多一些,包括数分、线代、概率论,还有一些机器学习基础。由于我并非人工智能领域的专家,这本书也并没有怎么读,所以直接引用这本书的官方介绍。《深度学习》由全球知名的三位专家Ian Goodfellow、Yoshua Bengio 和Aaron Courville撰写,是深度学习领域奠基性的经典教材。全书的内容包括3个部分:第1部分介绍基本的数学工具和机器学习的概念,它们是深度学习的预备知识;第2部分系统深入地讲解现今已成熟的深度学习方法和技术;第3部分讨论某些具有前瞻性的方向和想法,它们被公认为是深度学习未来的研究重点。《深度学习》适合各类读者阅读,包括相关专业的大学生或研究生,以及不具有机器学习或统计背景、但是想要快速补充深度学习知识,以便 ...

center h1 in the middle of screen(示例提问)

How can I center horizontally and vertically a text? I don't want to use position absolute because I try with it and my other div getting worse. Is there another way to do that ?div { height: 400px; width: 800px; background: red; }&lt;div&gt; &lt;h1&gt;This is title&lt;/h1&gt; &lt;/div&gt;

写给新诗的入门者的几条建议

&nbsp;我来为大家推荐几个诗人帮助大家更好地入门和学习新诗。八十年代是个文学热潮,其中诗歌发展尤为迅速,有笑话说:“一板砖下去砸晕十个大学生,九个都是诗人。”相应地,朦胧诗人在大众的世界里流传开来。 &nbsp;相信有许多朋友了解新诗是从海子和顾城开始的,那么在这之后,当然可以深耕这几位诗人,也可以去了解其他的诗人。我个人是非常喜欢穆旦的,而且我认为穆旦是一位非常值得后来者学习的大诗人。相较于以朦胧诗和后朦胧诗出名的一代人,穆旦处在中国新诗草创和形成的时期,语言的张力和新意象的创造都是十分直接和有力的,造成的影响也是多样的,这对于后来者的学习很有益处。而且穆旦在吸收西方现代诗歌营养的同时,也在吸收转化拜伦雪莱等浪漫主义诗人的手法,他的几首诗剧(《神魔之争》《森林治魅——祭胡康河上的白骨》等)我都喜欢,而且写的很好也很动人。晚年的穆旦的作品达到了返璞归真的境界,言语朴实,但是寄意深远。或许晚年的穆旦和旧诗更为亲切,读者入门也更简单。总之,在新诗形象的塑造、意象的表达以及技巧的展示中,穆旦毫无疑问都是上等的,再进一步讲,穆旦诗中隐现的民族、苦难的民众、分裂的祖国、迷惘的自我这一系列形 ...

Aurélien Géron人工智能入门教材:Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow

这是本手把手教你入门人工智能的教材,作者是Aurélien Géron。这本书是本畅销书,非常火,被翻译成了多国语言。本书的作者也把自己的这本书免费上传到自己的网站上,不知道现在还是不是,反正我当时下了😇。我一个做算术几何的,当初之所以会关注人工智能,一方面是当时人工智能挺火的,就连算术几何领域也有专家跟计算机科学家们合作,比如Geordie Williamson以及著名的Peter Scholze。Peter Scholze弄了个Liquid Tensor Experiment(液体张量实验),用于所谓的自动定理证明,而这个实验源自于Scholze跟Dustin Clausen在解析几何方面的合作,即将代数几何应用于解析几何。扯远了,回到正题。这本教材可以说图文并茂,配有丰富的插图,并且讲解非常通俗易懂,对初学者非常友好,基本上就需要有点数学分析的基础就可以读了。而且书中还会附上代码过程,给你随时练手,毕竟这个跟编程紧密结合的学科,还是需要编程实践才好学懂的。现在我把这本书分享给对人工智能感兴趣的人。PS:这本书总共八百多页,而且插图很多,因此体积较大。我将其分成三个压缩包分卷上传。 ...

初二,在学交代同调李代数,下一步怎么办?

知乎提问:很抱歉用这个吸引目光的标题骗人进来,但我的确很需要帮助目前我的情况是标题上提到的交代什么的学了,但是和体验卡似的,学完两三周内见题直接秒(有点夸张,但都会基本上差不多),之后就连自己在书上写的过程都看不懂了…再加上课内也没法不管主要问题其实就是时间不够加自控力不足,也就是如何更好自控和如何协调数学与课内的关系(数学扔掉是每个链都有上界的非空偏序集没有极大元,但我课内在我们学校排名才前10%左右,就这个成绩还是考前暂时不学数学备考的结果,更何况我父母要求的中考目标换算到我们学校差不多要排名前3%)总结就是数学和课内分配问题,但我数学扔不下,课内又有强制目标目前想到的解决方法有丘班,但我高数数分什么的记忆性强的全忘了(点明某三角函数的一堆积分,我得现场推),用的书又不深(同济高数+普林斯顿的两本),真要考丘班得消耗半个学期才基本上能保证应该没问题(如果只按0试(好像是一试还是什么)的难度没有较大幅度变动的话)还有生产一篇学术垃圾之后和校方交涉,但这个问题更多求点更靠谱的解决方法,谢谢!(又发了一遍是因为之前发到想法去了...我好蠢)我的回答:说实话所谓的丘班根本不是给普通家庭的学 ...

数学入门应该看哪些书?有什么入门书后看了以后能让人爱上数学?

知乎提问:有什么数学方面的入门书能让人看了后会爱上数学的?参加工作很长一段时间了,但对数学的认识和应用都一直处于很初级的水平(初中时的水平吧)。我知道这个数学世界很精彩,也很迷人,也许我会爱上它而不能自拔,但我先得找到一道进入这个世界的门我的回答:如果你对微分几何感兴趣,可以尝试读Loring W Tu微分几何经典入门教材:An Introduction to ManifoldsLoring W Tu微分几何教材:Differential Geometry Connections, Curvature, and Characteristic Classes。如果你对自己的能力比较自信可以先读陈省身的《微分几何讲义》,我以前初三高一的时候就是先看的这本书,后来才看的Loring W Tu。关于Loring W Tu的这两本书,先读第一本,第一本只需要有数分高代的基础就完全够了。有了第一本的基础后,可以读第二本。把这两本读懂后可以读 Jürgen Jost黎曼几何与几何分析教材:Riemannian Geometry and Geometric Analysis。我当初高二的时候就是因为读 ...

最近有人反馈网站卡、打不开,我自己也试过这种情况,已再次对弦圈进行优化

最近这段时间,由于使用弦圈的人数比以前多了,尤其是同一时间使用的人数,这就导致网站加载起来会比较卡,甚至有时候出现502错误,也就是打不开网站。遇到这种问题,一般等一等刷新一下就过去了,但是还是对用户体验造成了不好的影响。昨天开始受到反馈后,我再次进行了测试,发现打开文章的速度确实比打开首页的速度要慢,也就是说弦圈部分页面的加载速度确实有问题,需要优化。接着首页打开的速度其实也慢了一些了。于是我重新优化了一下那些加载比较慢的页面的代码,然后还重新优化了一下后端的一些代码。经过今天的再次优化,目前我打开弦圈的页面,感觉也比之前顺畅了一些。不过目前服务器的配置确实有点吃不消了,CPU倒还好,主要是内存真的不够用了,可能卡主要也是内存不够的原因吧,我目前也在考虑换个内存更高的服务器。18:51更新:刚刚已经将弦圈的前端代码放到另一个内存更多的服务器上,在这个过程中一不小心让网站中断了一会儿。现在迁移已经全部完成!目前弦圈使用了两台服务器,一台2核4G用于前端,另一台2核2G用于后端,还有一台1核1G的云数据库。另外我还给域名挂上了CDN加速,目前来看应该比之前顺畅不少。

在已经掌握大学本科微积分、线代、概率的基础上怎么更进一步学习数学?

知乎提问:如题,我在准备考研数学中终于领略到了一些数学的美妙之处了,现在特别感兴趣,想等着考完试有时间再精进一下也为下一步的学习打打基础,那么请教各位大佬们我该去先去学哪些书呢?数学分析?高等代数?我作为一个普通工科生不太了解这些书的入门顺序,请各位数学大佬指点下,谢谢啦!!!我的回答:如果对微分几何感兴趣,可以尝试读 Loring W Tu微分几何经典入门教材:An Introduction to Manifolds 和 Loring W Tu微分几何教材:Differential Geometry Connections, Curvature, and Characteristic Classes。先读第一本,第一本最简单你的基础完全够了。有了第一本的基础后,可以读第二本。把这两本读懂后可以读 Jürgen Jost黎曼几何与几何分析教材:Riemannian Geometry and Geometric Analysis。如果对代数几何感兴趣,那就先入门交换代数,可以读Zariski交换代数经典教材Commutative Algebra系列(pdf可复制版)、Atiyah交换代数 ...

作为一个年轻的数学工作者,你们是如何独立于导师选定问题的?

知乎提问:感觉有意思的我做不动,我会做的又无趣(且无人关注)。那请问你们是如何自己选定一个有意思且做的动的问题的?我的回答:想要找问题,首先需要阅读很多相关的文献,但是这一步其实很多人都会做了,他们的问题是哪怕读了再多的文献,似乎也不知道有啥问题可做。其实在我看来原因无非那么几个第一是他们自以为自己掌握了正确的学习方法,看过的文献每一个细节都彻底弄懂弄透了,实际上他们连自己学的东西都没搞明白;第二是他们好高骛远,瞧不起一些比较基本的小问题,却不知道很多重要且有趣的理论往往来自于不经意间一些最简单的问题;第三就是科研能力问题了,这方面要展开太多可讲了,如数学成熟度不够、计算能力不足导致无法将脑海里的理论实现,或是想象力不足无法构想出一个一般性的理论,等等。这三点能做好,基本上就能脱离导师,独立自主做出研究成果了。其中第三点是最体现一个人数学天赋的地方了,不过其也是建立在第一点跟第二点的基础之上的。关于如何学习达到research level的程度,不是一两句话就能简单讲完的,可以参考我之前的文章和帖子,其实只要把第一点做好,且做到极致,第二点只要你调整好自己的心态就能做到。想学好数学不是 ...