1、浅拷贝
可以使用Object.assign方法实现对象的浅拷贝,assign的方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
例如:
注意:Object.assign()遇到同名属性的替换,最后面的参数会覆盖前面定义的
上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: ‘hello’, d: ‘e’ } }的结果。这通常不是开发者想要的,需要特别小心。
2、深拷贝
可以使用JSON.parse()和JSON.stringify()实现深拷贝。但是此方法不能复制数据的类型。
所以要用:浅拷贝+递归思想,实现深拷贝
简单的数据形式:
const arr=[1,2,3,4]
function deepCopy(origin,target){
//目标值先置为空
var target=null;
//判断原始对象的数据类型
if(typeof origin==='object'){
//判断拷贝的是数组还是对象
target=origin instanceof Array?[]:{};
for(let key in origin){
//递归拷贝
target[key]=deepCopy(origin[key],target[key])
}
}else{
//基本类型直接赋值
target=origin;
}
return target;
}
let newObj=[];
const result=deepCopy(obj,newObj);
result.push(1)
console.log(result,obj);
复杂的对象形式:
const obj={
name:'zs',
age:18,
friends:['Kate','Bob','Mike'],
hobby:{
hobby1:'codes',
hobby2:'piano'
}
};
function deepCopy(origin,target){
//目标值先置为空
var target=null;
//判断原始对象的数据类型
if(typeof origin==='object'){
//判断拷贝的是数组还是对象
target=origin instanceof Array?[]:{};
for(let key in origin){
//递归拷贝
target[key]=deepCopy(origin[key],target[key])
}
}else{
//基本类型直接赋值
target=origin;
}
return target;
}
var newObj={};
const result=deepCopy(obj,newObj);
// console.log(result);
obj.hobby.hobby3='hobby3'
obj.friends.push('Cherry');
result.friends.push('11')
console.log(result.friends,result.hobby);// ["Kate", "Bob", "Mike","22"] { hobby1:'codes',hobby2:'piano'}
console.log(obj.friends,obj.hobby)// ["Kate", "Bob", "Mike", "Cherry"] { hobby1:'codes',hobby2:'piano',hobby3:'hobby3'}
总结:如果是基本类型,就直接赋值;复杂类型,比如:对象、数组,就需要采用递归的方式,遍历一遍,变成简单类型进行在赋值,从而做到深拷贝,改变原来的数据,不会影响到新的数据;改变新的数据,不会影响原来的数据。从而做到改变不会影响其他数据的改变。