浅拷贝与深拷贝
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
浅拷贝: 只复制指向某个对象的指针而不复制对象本身,新旧对象还是共享同一块内存。
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign()进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。
深拷贝:会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
深拷贝的实现方式
1.JSON.parse(JSON.stringify())
原理: 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。
2.手写递归方法
递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝;
浅拷贝:拷贝的目标对象的地址和源对象的地址的内存空间,是同一块空间,让几个对象共用一个内存。
浅拷贝只拷贝一层,基本数据类型不会相互影响,复杂数据类型会相互影响;
Object.assign(target,sources)实现浅拷贝;其中target是目标对象(新对象),sources是源对象(旧对象),返回目标对象
深拷贝:克隆出一个对象,数据相同,但是引用地址不同,
深拷贝是多层拷贝,每层都会拷贝,改变任意数据,都不会相互影响。
JSON.parse(JSON.stringify(obj))实现深拷贝;首先先转换为json串,然后转化成对象。