数组的浅拷贝
将原对象或者原数组的引用直接赋给新对象|数组,新对象/数组只是原对象的一个引用(当新数组或者对象改变时,原数组或者原对象就会跟着改变),对于基本数据类型,新旧之间不影响。此称为浅拷贝
var arr=["old",1,true,null,undefined];
var 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];
如果是数组,可以利用数组的一些方法:slice,concat返回一个新数组的特性实现拷贝
- 使用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]
2. 使用slice
```javascript
let new_arr=arr.slice();
- 数组嵌套对象或者数组
var arr = [{old: 'old'}, ['old']];
var new_arr = arr.concat();
arr[0].old = 'new';
arr[1][0] = 'new';
console.log(arr) // [{old: 'new'}, ['new']]
console.log(new_arr) // [{old: 'new'}, ['new']]
数组的深拷贝
完全的拷贝一个对象,即使嵌套了对象,两者也是互不影响的
let arr=['old', 1, true, ['old1', 'old2'], {old: 1}]
var new_arr = JSON.parse( JSON.stringify(arr) );
console.log(new_arr);
深拷贝的做法
- JSON.parse(JSON.stringify(a)):使用有限
- 递归浅拷贝:性能不好
- proxy,通过拦截set和get或者是利用object.defineProperty()
/*proxy实现思路
*/