深拷贝与浅拷贝

深拷贝

递归复制对象或数组的所有内容,包括嵌套的对象和数组。改变复制后的对象或数组不会影响到原对象或数组。

  • JSON
const arr = [{ a: 1 }, { b: 2 }];
const deepCopy = JSON.parse(JSON.stringify(arr));

不能拷贝函数,不能拷贝特殊值

lodash

const _ = require('lodash');

const arr = [{ a: 1 }, { b: 2 }];
const deepCopy = _.cloneDeep(arr);

手写深拷贝

function deepClone(obj) {
if (obj == null) return null;
if (obj instanceof RegExp) return new RegExp(obj);
if (obj instanceof Date) return new Date(obj);
if (typeof obj == "function") return new function (obj) { };

if (typeof obj != "object") {
return obj;
}
var newobj = new obj.__proto__.constructor;
for (var key in obj) {
newobj[key] = deepClone(obj[key]);
}
return newobj;
}

浅拷贝

复制对象或数组的引用,而不是内容。改变复制后的对象或数组会影响到原对象或数组。

slice

const arr = [1, 2, 3];
const shallowCopy = arr.slice();

concat

const arr = [1, 2, 3];
const shallowCopy = [].concat(arr);

map

const arr = [1, 2, 3];
const shallowCopy = arr.map(x => x);

展开运算符

const arr = [1, 2, 3];
const shallowCopy = [...arr];