可以将多个对象的属性值复制到新对象中
var obj={a:1,b:2};
var o={c:1};
var o7=Object.assign({},obj,o);
console.log(o7);
如果将多个对象复制到一个对象上时,如果有相同属性,
后面的对象会覆盖前面对象的相同属性
var obj={a:1,b:2};
var o={c:1};
var obj1={a:10,c:20,d:30};
var obj2={c:100,d:70,e:50};
var o8=Object.assign({},obj,obj1,obj2);
console.log(o8);
Object.assign不能复制原型链,不可枚举属性
var arr=[1,2,3];
var arr1=Object.assign([,,,5],arr);
arr[0]=10;
console.log(arr1);
深复制是对象当中的子元素、子对象和原来的对象都没有引用关系,而浅复制只有第一层有引用关系,以后各层都没有引用关系。
——————————————————到此为止我们学过3种复制对象的方法,但是这三种仅能作为浅复制
下面完成深复制
var o9=JSON.parse(JSON.stringify(obj));将对象变成字符串,再将字符串变为对象
分析:
var obj={
a:1,
b:2,
c:{
d:3,
e:4,
}
}
这种只能浅复制,因为只遍历了第一层属性赋值。
var o={};
for(var prop in obj){
o[prop]=obj[prop];
}
// obj.a=10;
// obj.c.d=10;
console.log(o);
这种 完成了一种浅复制
var o={...obj};
obj.c.d=10;
console.log(o);
这个也是浅复制
var o=Object.assign({},obj);
obj.c.d=10;
console.log(o);
这个是深复制,但是不可枚举属性和方法都无法进行复制
var o=JSON.parse(JSON.stringify(obj));
obj.c.d=10;
console.log(o);
原因:将obj的每一层全部都转换为字符串,因此将 obj.c.d=10;时,o结果的c的结果没有发生改变,已经将obj变成了字符串,然后再将字符串生成了新的对象,和原来的对象没有引用关系
但是这样做深复制也是不好的,不可美剧属性和方法都不能进行复制
举例:
var obj={
a:1,
b:2,
c:{
d:3,
e:4,
f:function(){
console.log("aaa");
}
}
}
var o=JSON.parse(JSON.stringify(obj));
obj.c.d=10;
console.log(o);
运行结果:c当中少了一个f的方法。