Skip to content

deepClone

对象深克隆

配置项

参数类型是否必选默认值参数描述
targetObject-要克隆的目标对象
hashObjectnew 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;
}