深拷贝与浅拷贝

深浅拷贝之前先说一下堆和栈的区别

堆和栈的区别

栈,是先进先出的数据结构,自动分配内存空间,会自动释放内存,主要存基础数据类型的值(undefined,null,boolean,number,string)
堆,动态分配内存空间,大小不定,不会自动释放内存,不主动释放,程序结束会由浏览器回收,存放的是引用类型(对象(object),数组(array),函数(function),保存的不是类型变量本身,而是指向内存空间的指针

基础类型的内存存放, b 和a 属于不同的内存空间,改变b 的值不会影响a的值

let a =1 ,let b=a  b=3
变量
a1
b3

引用类型的存放,在栈内存中存放地址,在堆内存中存放变量的值

let b=[1,3,5],let a=1

在这里插入图片描述

浅拷贝就是拷贝数据的内存地址,obj1和obj 的指针一样,指向堆内存的地址就一样,改变obj1的值,obj的值也会随之改变

let a=1,let b=a,b=2
let obj=[1,3,4],let obj1=obj ,obj=[1,3,5]

在这里插入图片描述

深拷贝是更深一层的拷贝,在内存中开辟一个新的存储空间,改变一个值并不会影响另一个的值

var obj=[1,3,5]
let obj1=arr.slice(0)
obj1[1]=4

在这里插入图片描述

深拷贝的方法

- 使用递归的方式实现深拷贝

let deepColon=(arr,newarr)=>{
for(var key in arr){
if(arr[key]instanceof Array){
newarr[key]=[]
deepColon(arr[key],newarr[key])
}else if(arr[key]instanceof Object){
newarr[key]={}
deepColon(arr[key],newarr[key])
}else{
newarr[key]=arr[key]
}
}
return newarr
}
  • 通过json 方式实现深拷贝,function 不可以用

var arr=[13,5]
var newarr=JSON.parse(JSON.strigify(arr))
  • 单层深拷贝

var obj={name:[1,4,6],age:2}
var obj1={...obj}
obj1.age=3 // obj.age=2
obj1.name[1]=7 //obj.name=[1,7,6]
var a = [{name: [1, 2, 3] ,age:2},3]
var b = Object.assign([],a) 
b[1]=2 // a[1]=3
b[0].age=7//a[0].age=7

单层深拷贝只拷贝了一层,第一层是基本数据属性值是基本数据类型的是深拷贝,第一层数据类型是引用类型的,则是浅拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值