深浅拷贝概念
深拷贝和浅拷贝只针对象 Object, Array 这样的复杂对象(引用类型)的。
复制引用(引用类型)的拷贝方法称之为浅拷贝,创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果
属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
深拷贝就是指完全的拷贝一个对象,将原对象的各个属性递归复制下来。这样即使嵌套了对象,两者也相互分离。
浅拷贝 对基本类型拷贝值,引用类型拷贝引用
Object.assign()
扩展运算符…
1 | var shallowCopy = function(obj) { |
深拷贝(将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。)
JSON.parse(JSON.stringify(a)): 性能最快
具有循环引用的对象时,报错 当值为函数、undefined、或symbol时,无法拷贝
递归复制
1 | // 不考虑循环引用 |
1 | // 不考虑循环引用 |
1 | // 考虑循环引用 只考虑了普通的 object和 array两种数据类型 |
1 | // 终极版 |
尽管使用深拷贝会完全的克隆一个新对象,不会产生副作用,但是深拷贝因为使用递归,性能会不如浅拷贝,在开发中,还是要根据实际情况进行选择。