deepClone
对象深克隆
配置项
| 参数 | 类型 | 是否必选 | 默认值 | 参数描述 |
|---|---|---|---|---|
| target | Object | 是 | - | 要克隆的目标对象 |
| hash | Object | 否 | new WeakMap() | - |
返回值
| 类型 | 描述 |
|---|---|
| Object | 克隆后的对象 |
示例
let a = {name: 'zhang', age: 18}
let b = deepClone(a)
a === b // false源码
js
export function deepClone(target, hash = new WeakMap()) {
function isObject(target) {
return typeof target === "object" && target !== null;
}
// 如果不是对象类型,直接返回(注意null的判断,typeof null 为 ‘object’)
if (!isObject(target)) return target;
// 判断是否已经添加了该引用,如果有直接冲hash结构中取出
if (hash.get(target)) return hash.get(target);
// 判断是数组还是对象,进行特殊处理
let newObj = Array.isArray(target) ? [] : {};
// 将值(引用地址)存入hash结构,解决重复拷贝的问题
hash.set(target, newObj);
for (let key in target) {
if (Object.prototype.hasOwnProperty.call(target, key)) {
if (isObject(target[key])) {
newObj[key] = deepClone(target[key], hash); // 递归拷贝
} else {
newObj[key] = target[key];
}
}
}
return newObj;
}
@keyboarder-yang