目录
一、深拷贝与浅拷贝的定义
什么是深拷贝(deepCopy):
深拷贝复制变量值,对于引用数据,则递归至基本类型后,在复制。深拷贝后的对象与原来的对象是完全隔离的,互不影响,拷贝对象最表层的数据
简单来说:是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。就是在计算机中开辟一个新的内存地址用于存放复制的对象。
什么是浅拷贝(shallowCopy):
是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用当引用指向的值发生改变时也会跟着改变,拷贝对象的各个层级的属性。
简单来说:就是只是增加了一个指针指向已存在的内存地址。仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会发生改变
二、举个栗子
1、浅拷贝
var arr = [7,8,9];// 一维数组
var a = arr.slice();// 实现数组的浅拷贝
a[0] = 9;
console.log(arr[0]);
console.log(a[0])
//此时输出的是1和9
浅拷贝的数组是一个新的数组,是在堆中新开一块空间用来存储,a在堆中存储的地址与arr数组的地址是不一样的,所以它们都是独立存在并不会相互影响。
但是也有其他的情况会使浅拷贝的新数组影响到原数组
var arr = [[7,8],[9,10]];// 一维数组
var a = arr.slice();// 实现数组的浅拷贝
a[0][0] = 100;
console.log(arr[0][0]);
console.log(a[0][0])
//此时输出的是100和100
会导致原数组会发生改变的原因是嵌套在数组里面的子数组,在堆内存中其实是一个地址,所以这个地址也被复制过去了。而在新数组中改变这个子数组的时候,所用的地址是和原数组的子数组相同的地址。这样就导致新数组与原数组公用相同的子数组的地址,改变子数组的时候原数组也随之改变。
2、深拷贝
JSON.parse(JSON.stringify(obj))一种深拷贝的方法
先将一个对象转化为json对象,然后再解析这个json对象
var arr = [[7,8],[9,10]];// 二维数组
var a = JSON.parse(JSON.stringify(arr));// 可实现深拷贝
a[0][0] = 100;
console.log(arr[0][0]);
console.log(a[0][0])
//此时输出的是7和100
深拷贝过后,修改新数组中的一个子数组的元素,原数组不会被改变。
三、深拷贝与浅拷贝的区别
浅拷贝:当原数组第一层属性值是基本数据类型,那改变原数组对新数组会产生影响,但新数组的改变不会对原数组产生影响。但如果第一层的属性值为引用数据类型,那么改变原数组或者新数组,都会对对方产生影响。
深拷贝:会创造另外一个一模一样的对象,新数组与原数组不会共享内存,修改任意一方,对对方都不会产生影响