怎么实现深拷贝

212 阅读1分钟
// 怎么实现一个深拷贝

// js数据类型 Number String Boolean Symbol Object Null Undefined

// 需要注意Function、Date、RegExp

// 深克隆:重新开辟了堆空间,修改原对象的值不会在对克隆对象造成影响
// 浅克隆:只是克隆了对象的引用,修改原对象会对克隆对象造成影响

function deepClone(target, cache = new Map()) {
    let dist
    // 解决循环引用的问题
    if(cache.get(target)) {
        return cache.get(target)
    }
    // 匹配对象类型
    if(target instanceof Object) {
        if(typeof target === Array.isArray(target)) { // 匹配数组
            dist = []
        } else if(target instanceof Function) { // 匹配函数
            
            dist = function() {
                return target.call(this, ...arguments)
            }
        } else if(target instanceof Date) { // 匹配日期
            dist = new Date(target)
        } else if(target instanceof RegExp) { // 匹配正则表达式
            dist = new RegExp(target.source, target.flags)
        } else {
            dist = {} // 匹配普通对象
        }
        cache.set(target, dist)  // 解决循环引用的问题 
        for(let key in target) {
            // 只遍历本身的属性
            if(target.hasOwnProperty(key)){ // 不遍历原型链上的属性
                dist[key] = deepClone(target[key]);
            }
        }
    } else {
        dist = target
    }
    // 匹配基本类型
    return dist
}