1. 程式人生 > >【深度復制的坑】1、對象assign復制的假深度,2、數組slice復制的坑,3、還有數組map復制的坑

【深度復制的坑】1、對象assign復制的假深度,2、數組slice復制的坑,3、還有數組map復制的坑

map 淺復制 跟著 turn spa ice 屬性 arr slice

1、對象復制的坑 Object.assign()

Object.assign()  //淺復制 基本沒用 跟直接用= 一樣

Object.assign(true,{}) // 以為是深拷貝,其實只是一級屬性復制,比淺拷貝多深拷貝了一層而已。第二層一樣是淺拷貝,會改變原值

2、數組復制的坑,即使是slice復制,如果內部是對象的話,還是會地址指向,導致修改新數組的時候,老數組也改變

var arr = [{a:11},{a:11}];  //arr [{a:11},{a:11}]
var arr1 = arr.slice(0);   //arr1 [{a:11},{a:11}]
arr1[0].a = 22  
//
以為arr不會跟著改變,結果竟然變了 //arr1 [{a:22},{a:11}] arr [{a:22},{a:11}]

結果證明,slice復制只是潛復制,不能深度復制對象內容

3、同樣是數組復制的坑,如果數組內容元素是對象的話,map也會改變改變原值的

var arr = [{a:11},{a:11}]; //arr  [{a:11},{a:11}]
arr.map(v=>{
  v.b=22;
  return v;
}) 
//是不是以為這根arr沒半毛錢關系,你太天真了,arr已經改變
//arr  [{a:11,b:22},{a:11,b:22}]  已經多出來了個b屬性。。。。

【深度復制的坑】1、對象assign復制的假深度,2、數組slice復制的坑,3、還有數組map復制的坑