JavaScript深浅拷贝的理解
深浅拷贝只是针对引用类型的,因为引用类型是存放在堆内存中,在栈地址有一个或者多个地址来指向堆内存的某一数据
浅拷贝:
被赋值对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用任然指向原来的对象。
浅拷贝仅仅复制所考虑的对象,而不复制他所引用的对象,如果你修改了元对象的值,那么原来的对象也会被修改
深拷贝:
深拷贝事一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢且内存占用较大。
深拷贝把要复制的对象所引用的对象都复制了一遍。如果你修改了元对象的值,那么原来的对象不会被修改,两者事相互独立的。
代码案例:
浅拷贝:
// A code block
let arr= [1,2,3,4];
let brr=arr
brr[0]=11
console.log(arr,brr)
// An highlighted block
let arr= [1,2,3,4];
let brr=arr
brr[0]=11
console.log(arr,brr)
[11, 2, 3, 4]
[11, 2, 3, 4]
本来是想把arr赋值给brr,修改brr的0下标时,却发现arr也发生了改变
深拷贝:
// A code block
let arr=[1,2,3,4]
let brr=JSON.parse(JSON.stringify(arr))
brr[0]=11
console.log(arr,brr)
[1,2,3,4]
[11,2,3,4]
// An highlighted block
let arr=[1,2,3,4]
let brr=JSON.parse(JSON.stringify(arr))
brr[0]=11
console.log(arr,brr)
[1,2,3,4]
[11,2,3,4]
对比刚才的浅拷贝案例,可以发现在深拷贝中 元数组arr的值并没有被改变,可以说两者事相互独立的