以前学习的对象的复制⽅法:
var obj={a:1,b:2}; for(var prop in obj){ o[prop]=obj[prop]; }
var obj={a:1,b:2}; var o={c:1};
//将{}对象中obj复制给o对象,重新设置了o的新的引⽤地址时obj复制并且赋值 var o={...obj}; obj.a=10;
console.log(o===o1);
assign()
ES6以后才有的⽅法
将obj的所有属性复制到o的属性上 Object.assign(o,obj); console.log(o);
将obj对象的所有属性复制到⼀个空对象的属性上,并且返回这个空对象 var o1=Object.assign({},obj); var o2={};
var o3=Object.assign(o2,obj); console.log(o2===o3);
Object.assign不能复制原型链属性 var o6=Object.assign({},o4); console.log(o6);
可以将多个对象的属性值复制到新对象中 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的⽅法。
因篇幅问题不能全部显示,请点此查看更多更全内容