参考:深拷贝和浅拷贝区别
基础数据类型是存在栈中(大小固定且会自动释放,随着方法的执行结束,这个方法的内存栈也自然销毁),引用类型是存在堆中的(大小不固定且不会自动释放)
浅拷贝和深拷贝(针对引用类型Array、Object)
浅拷贝是只复制一层属性名层,深拷贝是复制多层,每一层都拷贝。
浅拷贝例子1:
var arr1 = [1,2]
var arr2 = []
arr2 = arr1
arr2[0]= 3;
console.log(arr1);//[3,2]
console.log(arr2);//[3,2]
浅拷贝例子2:
var a = {
name:‘1’
};
var b = a;
b.name = ‘3’;
console.log(a.name);//3
数组的属性名会放在栈里面,值放在堆里面,但是栈内存会提供一个引用的地址指向堆内存中的值,arr2其实复制的是arr1的引用地址,值内存是没有变的,所以arr2变后,arr1也变了。
浅拷贝例子2中解决办法就是用JSON.parse(JSON.stringify())深拷贝
Object.assign(目标对象,源对象)
ES6之Object.assign
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝(https://www.jianshu.com/p/d5f572dd3776)
例子(只有一级属性):
var obj1 = {a: 1,b:3};
var obj2 = Object.assign({},obj1)
obj2.a = 8;
console.log(obj1)//{a: 1, b: 3}
console.log(obj2)//{a: 8, b: 3}
例子(对象中有对象的时候):
var obj1 = {a:{b:3}};
var obj2 = Object.assign({},obj1)
obj2.a.b = 8;
console.log(obj1)//{a: {b: 8}}
console.log(obj2)//{a: {b: 8}}