浅拷贝:(1)基本数据类型:值完全拷贝,存在新开栈内存中;
(2)引用数据类型:拷贝的是栈内存中指向堆内存的地址,地址存在新开栈内存中,地址指向堆内存中数据,若修改被拷贝对象或者新拷贝的变量,则两者均会被修改,因为修改的是堆内存中的数据,而指向堆内存数据地址的栈内存值并未改变,所以修改两种中一个变量的值,会影响另一个变量的值。
深拷贝:(1)基本数据类型:同浅拷贝类似,拷贝的是栈内存中的值,并存在新开栈内存中;
(2)引用数据类型:不仅会在栈内存中新开空间,还会在堆内存中新开空间存对拷贝对象在堆内存中的数据,栈内存数据存指向新开堆内存中数据的地址。
简单来说:
浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块堆内存
深拷贝会创造一个一模一样的对象,新对象和原对象不共享堆内存,修改新对象不会改变原对象
深拷贝方法:
1、JSON.parse(JSON.stringfy(obj))
//JSON.stringify()将对象转换成json字符串
//JSON.parse()反序列化,将json字符串反序列化成js对象
2、jQuery.extend()方法
$.extend(true, target, object) //举例:let newObj = $.extend(true, {}, oldObj)
3、lodash库的_.cloneDeep()方法
举例:let newObj = _.cloneDeep(oldObj)
4、普通循环遍历递归出来
5、等等一些方法