浅拷贝只复制对象的第一层属性,如果属性是引用类型(如对象、数组),则复制的是引用地址,新旧对象会共享这些引用类型的属性。
展开运算符 (...)
const obj = { a: 1, b: { c: 2 } };
const shallowCopy = { ...obj };
Object.assign()
const obj = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, obj);
数组的 slice() 方法
const arr = [1, 2, [3, 4]];
const shallowCopy = arr.slice();
数组的 concat() 方法
const arr = [1, 2, [3, 4]];
const shallowCopy = arr.concat();
深拷贝会递归复制对象的所有层级,创建一个完全独立的新对象,新旧对象不会共享任何属性。
JSON.parse(JSON.stringify())
const obj = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(obj));
递归实现
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
const clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
使用第三方库
_.cloneDeep()
const _ = require('lodash');
const deepCopy = _.cloneDeep(obj);
MessageChannel
function structuralClone(obj) {
return new Promise(resolve => {
const { port1, port2 } = new MessageChannel();
port2.onmessage = ev => resolve(ev.data);
port1.postMessage(obj);
});
}