Appearance
深浅拷贝 (Deep/Shallow Clone)
浅拷贝 Shallow Clone
浅拷贝是指:创建一个新对象,这个对象对于基本数据类型直接复制其值,对于引用类型复制其内存地址(引用)。
js
function shallowClone(target) {
// 1. 处理基本数据类型 和 null
if (target === null || typeof target !== "object") {
return target;
}
// 2. 创建一个新的对象
const newObject = {};
// 3. 遍历
for (let key in target) {
// 4. 如果是其自身对象中的属性
if (Object.prototype.hasOwnProperty.call(target, key)) {
// 5. 直接赋值给新对象
newObject[key] = target[key];
}
}
// 6. 返回新的对象
return newObject;
}深拷贝 Deep Clone
深拷贝是指:完全复制一个对象,包括对象中的嵌套对象,创建一个与原对象完全独立的新对象,两者不共享任何内存地址。
js
function deepClone(target, map = new WeakMap()) {
// 1. 处理简单数据类型 或者 null
if (target === null || typeof target !== "object") {
return target;
}
// 2. 边界处理,也可以是 Map 等类型
if (target instanceof Set) {
const newSet = new Set();
target.forEach((v) => {
newSet.add(v);
});
return newSet;
}
// 3. 创建新的对象或者数组
const newObject = Array.isArray(target) ? [] : {};
// 4. 用于解决循环引用问题
if (map.has(target)) {
return map.get(target);
}
map.set(target, newObject);
// 5. 遍历
for (let key in target) {
// 6. 找到自身属性
if (Object.prototype.hasOwnProperty.call(target, key)) {
// 7. 递归调用或去新的值或者引用
newObject[key] = deepClone(target[key], map);
}
}
// 8. 返回 clone 后的对象
return newObject;
}