浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存
Object.assign()
let obj = {
a:{
},b:{
}}
let obj1 = Object.assign({
},obj)
obj1.c = 1
console.log(obj,obj1);
- 扩展运算符
...
let obj = {
a:{
c:1},b:{
}}
let obj1 ={
...obj}
obj1.a.c = 2
console.log(obj,obj1);
深拷贝:新旧对象不共享内存,修改新对象不会改到旧对象。
JSON.parse(JSON.stringify())
缺点 a.循环引用报错 b.不能拷贝function等
- 第三方库
lodash
- 手写递归
function deepClone(target, map = new Map()){
if(typeof target === 'object' && target !== null){
let cloneTarget = Array.isArray(target)?[]:{
}
if(map.has(target)){
return map.get(target)
}
map.set(target, cloneTarget)
for(let item in target){
cloneTarget[item] = deepClone(target[item], map)
}
return cloneTarget
}else{
return target
}
}