深拷贝和浅拷贝的快速解剖

哑域析取
• 阅读 831

值和引用的区别

他们的区别在于箭头指向:
值类型就是把我的绝世武功给你,我是不变的!而你可以学我的!但是你学了蛤蟆功,跟我没什么关系
引用类型取决于变量地址,确切的说你偷走我的钱包!花完之后又给了我!最后值都是0.1

值类型
number string boolean
var a=1
var b = a
//此时a和b相同等于1

b=2
//此时b等于2,a还是1

引用类型
object { } [ ]
var a={ money:500 }
var b = a
//此时a和b都是'我'

b.money = 1
//此时b等于1,a拿到的也是1

浅拷贝

想让引用类型 值类型一样效果:你过你的,我过我的
object.assign({}, a)
{}空的或者新增,可惜他只能一层浅拷贝

var a = {
    name:"苍井空"
}

var b = Object.assign({}, a)
b.name = "饭岛爱"
console.log(`此时a:${a.name}, 而b则是${b.name}`)

深拷贝

第一层的a{ name:"xx" }
本体没变,但是第二层的a{ mygirl: ... } 却都被改变了

第一招:lodash _.clone("浅")_.cloneDeep("深")

var a = { name:"大帅哥", mygirl:['苍xx','饭xx','波多xxx'] }
var b = _.cloneDeep(a)
var b = _.clone(a)

第二招:

var a = {
  name: "大帅哥",
  mygirl: ['苍xx', '饭xx', '波多xxx'],
}

var b = structuredClone(a)
b.mygirl[0] = "饭岛爱"

console.log(`a:${a.mygirl} `)
console.log(`b:${b.mygirl} `)
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
java 复制Map对象(深拷贝与浅拷贝)
java复制Map对象(深拷贝与浅拷贝)CreationTime2018年6月4日10点00分Author:Marydon1.深拷贝与浅拷贝  浅拷贝:只复制对象的引用,两个引用仍然指向同一个对象
2022年最新iOS面试题(附答案)
最近大家都要准备去面试或者已经在面试的,这里我给大家准备了挺多资料,可以私信我拿,看看了解下。底下就是我整理出来的一些面试题iOS类(class)和结构体(struct)有什么区别?Swift中,类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。所以他们两者之间的区别就是两个类型的区别。举个简单的
仔细看看,会有收获。js深浅拷贝
好好理解深浅拷贝和赋值(针对引用类型)赋值:两个对象指向同一内存地址。结果,无论是修改基本类型还是引用类型,两个对象的值都会改变。浅拷贝:两个对象指向不同的内存地址,但是他们中的引用类型数据指向同一内存地址。结果,修改引用类型,两个对象的值都会改变;修改基本类型,互不影响。深拷贝:两个对象指向不同的内存地址,他们中的引用类型也指向不同的内存地址。结果,均互不
晴空闲云 晴空闲云
4年前
也谈JavaScript浅拷贝和深拷贝
网上关于这个话题,讨论有很多了,根据各路情况我自己整理了一下,最后还是能接近完美的实现深拷贝,欢迎大家讨论。javascript中的对象是引用类型,在复制对象的时候就要考虑是用浅拷贝还是用深拷贝。直接赋值对象是引用类型,如果直接赋值给另外一个对象,那么只是赋值一个引用,实际上两个变量指向的同一个数据对象,如果其中一个对象的属性变更,那么另外一个也会变更。示
Souleigh ✨ Souleigh ✨
5年前
实现深拷贝的多种方式
实现深拷贝的多种方式简单来说,深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。1.简单深拷贝(一层浅拷贝)①for循环拷贝//只复制第一层的浅拷贝javascriptfunc
Kevin501 Kevin501
5年前
Go语言中new()和make()的区别
1.Go语言中的值类型和引用类型值类型:int,float,bool,string,struct和数组(数组要特别注意,别搞混了)变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。引用类型:slice,map,chan和值类型对应的指针变量存储的是一个地址(或者理解为指针),指针指向内存中真
Wesley13 Wesley13
4年前
Java深拷贝和浅拷贝
1.浅复制与深复制概念⑴浅拷贝(浅克隆)   复制出来的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。⑵深拷贝(深克隆)   复制出来的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向复制出来的新对象,而不再是原有的那些被引用的对象。换言之,深复制
Wesley13 Wesley13
4年前
Java对象的浅拷贝和深拷贝&&String类型的赋值
Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、方法传参或返回值时,会有值传递和引用(地址)传递的差别。浅拷贝(ShallowCopy):①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,
Stella981 Stella981
4年前
JVM调优总结一
数据类型   Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,cha
Wesley13 Wesley13
4年前
Java变量、数据类型和运算符
1\.变量计算机处理数据,变量被用来存储处理的数据,之所以叫做变量因为你可以改变存储的值。更确切的说,一个变量指向着一块存储特定类型值的地址,换句话说,一个变量有名称、类型和值。一个变量有一个名称,例如radius、area、age和height,每个变量的名称都是唯一的,这边可以方便我们设置和获取变量的值。我们简单的拿生活
Easter79 Easter79
4年前
Swift3.0 类和结构体的选择
结构体实例总是通过值传递,类实例总是通过引用传递先说说值类型和引用类型的区别值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝在Swift中,所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。引用类型在被赋予到一个变量、常