深浅拷贝之前先说一下堆和栈的区别
堆和栈的区别
栈,是先进先出的数据结构,自动分配内存空间,会自动释放内存,主要存基础数据类型的值(undefined,null,boolean,number,string)
堆,动态分配内存空间,大小不定,不会自动释放内存,不主动释放,程序结束会由浏览器回收,存放的是引用类型(对象(object),数组(array),函数(function),保存的不是类型变量本身,而是指向内存空间的指针
基础类型的内存存放, b 和a 属于不同的内存空间,改变b 的值不会影响a的值
let a =1 ,let b=a b=3
变量 | 值 |
---|---|
a | 1 |
b | 3 |
引用类型的存放,在栈内存中存放地址,在堆内存中存放变量的值
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
}
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
单层深拷贝只拷贝了一层,第一层是基本数据属性值是基本数据类型的是深拷贝,第一层数据类型是引用类型的,则是浅拷贝