浅拷贝主要是对指针的拷贝,拷贝后两个指针指向同一个内存空间
深拷贝需要不但对指针进行拷贝,并对指针指向的内容进行拷贝,经过深拷贝后的指针是指向两个不同地址的指针。
主要针对于引用数据类型参数说的,浅拷贝表示仅拷贝引用地址,深拷贝表示对于对象的克隆。
基本数据类型和引用数据类型在内存中如何存储
基本数据类型
基本数据类型变量都维护在栈区,基本数据类型的值保存在栈区。
var a = 123;
b = a;
a = 456;
var a = 123; b = a;基本数据类型是在栈内存中存储的,如下图,b = a的时候,b直接把a的值存进去
a = 456; 会把a的值改为456,但是对b没有任何影响,所以最后会输出a = 456;b = 123;
基本数据类型的值存在栈,值与值之间独立存在,修改一个值不会影响其他变量
-
引用数据类型
引用数据类型的引用地址保存在栈区,值保存在堆区。
var obj = {
name: 'zhangsan'
}
var obj1 = obj; //将对象obj赋值给对象obj1
console.log(obj.name); //zhangsan
console.log(obj1.name); //zhangsan
// 修改obj的name
// 当obj属性name变为"lisi"时,obj1属性name也变为"lisi"
obj.name = 'lisi';
console.log(obj.name); //lisi
console.log(obj1.name); //lisi
当栈存放引用类型时,值为对象的地址,obj与obj1指向同一个地址,所以当obj的name值变为“lisi”时,obj1也会发生变化
实现深拷贝的方法
1.通过json对象实现深拷贝(JSON.stringify,JSON.parse)
2.Object.assign()拷贝
3.lodash函数库实现深拷贝
4.递归的方式实现深拷贝
等等