深拷贝与浅拷贝
深拷贝
递归复制对象或数组的所有内容,包括嵌套的对象和数组。改变复制后的对象或数组不会影响到原对象或数组。
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];
|