数组的浅拷贝

将原对象或者原数组的引用直接赋给新对象|数组,新对象/数组只是原对象的一个引用(当新数组或者对象改变时,原数组或者原对象就会跟着改变),对于基本数据类型,新旧之间不影响。此称为浅拷贝

  1. var arr=["old",1,true,null,undefined];
  2. var new_arr=arr.concat();
  3. new_arr[0]='new';
  4. console.log(arr);//["old",1,true,null,undefined];
  5. console.log(new_arr);//["new",1,true,null,undefined];

如果是数组,可以利用数组的一些方法:slice,concat返回一个新数组的特性实现拷贝

  1. 使用concat ```javascript let arr=[‘old’,1,true,null,undefined]; let new_arr=arr.concat(); new_arr[0]=’new’;

console.log(arr);//// [“old”, 1, true, null, undefined] console.log(new_arr);// [“new”, 1, true, null, undefined]

  1. 2. 使用slice
  2. ```javascript
  3. let new_arr=arr.slice();
  • 数组嵌套对象或者数组
  1. var arr = [{old: 'old'}, ['old']];
  2. var new_arr = arr.concat();
  3. arr[0].old = 'new';
  4. arr[1][0] = 'new';
  5. console.log(arr) // [{old: 'new'}, ['new']]
  6. console.log(new_arr) // [{old: 'new'}, ['new']]

数组的深拷贝

完全的拷贝一个对象,即使嵌套了对象,两者也是互不影响的

  1. let arr=['old', 1, true, ['old1', 'old2'], {old: 1}]
  2. var new_arr = JSON.parse( JSON.stringify(arr) );
  3. console.log(new_arr);

深拷贝的做法

  • JSON.parse(JSON.stringify(a)):使用有限
  • 递归浅拷贝:性能不好
  • proxy,通过拦截set和get或者是利用object.defineProperty()
  1. /*proxy实现思路
  2. */