浅拷贝:只拷贝一层,更深层次的对象只拷贝引用(即对象的地址)。
缺点:由于浅拷贝拷贝的是对象的地址,因此 当你将一个对象A拷贝给对象B,这个时候修改对象B中的深层次的对象属性时,对象A的该属性也会被修改。
当然,缺点和优点在不同的场景下 ,是会发生转变的
//es6提供的浅拷贝语法糖
//target:你要拷贝的目标 sources被拷贝的对象
Object.assgin(target,...sources)
//js实现
var obj={
id:1,
name:"张三",
act:{
sing:"夜曲"
}
}
var o={}
//key:属性名 obj[key]:属性值
for(var key in obj){
o[key]=obj[key]
}
//最后可以尝试修改o中的对象属性,看看obj的对应属性会不会被修改
o.act.sing="一路向北";
console.log(o)
console.log(obj)
//最后会发现都被修改了
深拷贝:拷贝多层,每一级别的数据都会拷贝。
//js实现 深拷贝
var obj={
id:2,
name:"李四",
act:{
sing:"枫"
},
hobbies:['read','game']
}
var o={}
//封装函数
function deepCopy( newObj , oldObj ) {
for(var key in oldObj){
var item= oldObj[key];
//判断对象类型
//注意 这里Array也属于Object类型,所以将Array先判断
if( item instanceof Array){
newObj[key]=[];
//这里往深层递归
deepCopy(newObj[key],item );
}else if(item instanceof Object){
newObj[key]={};
deepCopy(newObj[key],item );
}else{
newObj[key]=item;
}
}
}
//调用函数
deepCopy(o,obj);
//验证
console.log(o);
o.act.sing="珊瑚海";
console.log(obj.act.sing);//输出为 枫