## ES5 只能用变通方法来深拷贝数组
```javascript
const a1 = [1, 2];
const a2 = a1.concat();
a2[0] = 2;
a1 // [1, 2]
```
上面代码中,`a1`会返回原数组的克隆,再修改`a2`就不会对`a1`产生影响。
## es6中扩展运算符提供了深拷贝数组的简便写法
```javascript
const a1 = [1, 2];
// 写法一
const a2 = [...a1];
// 写法二
const [...a2] = a1;
```
上面的两种写法,`a2`都是`a1`的克隆
## 合并数组浅拷贝
扩展运算符提供了数组合并的新写法。
```javascript
const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
// ES5 的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// ES6 的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
```
```javascript
const a1 = [{ foo: 1 }];
const a2 = [{ bar: 2 }];
const a3 = a1.concat(a2);
const a4 = [...a1, ...a2];
a3[0] === a1[0] // true
a4[0] === a1[0] // true
```
上面代码中,`a3`和`a4`是用两种不同方法合并而成的新数组,但是它们的成员都是对原数组成员的引用,这就是浅拷贝。如果修改了引用指向的值,会同步反映到新数组。
## 最简单的深拷贝方法
**JSON.stringify() 和JSON.parse()**
先用JSON.stringify()转为字符串,再用JSON.parse()转回去,用一个数组变量接一下便可。
```javascript
var list = JSON.parse(JSON.stringify(obj))
```