js手写深拷贝

// 使用遍历赋值的方式拷贝
const deepClone = (target, map = new Map()) => {
    // 基本数据类型
    if (typeof target !== 'object') {
        return target
    }

    // 引用数据类型特殊处理(递归处理)
    // 判断数组还是对象
    const temp = Array.isArray(target) ? [] : {}

    if (map.get(target)) {
        // map,允许将对象类型当成key进行存储 
        // 遇到已存在的值或对象时,直接返回该字段对应value,防止进入下方的循环导致死循环
        return map.get(target)
    }
    //  当遇到 a.key = a时,可以将对象当成key,value为当前temp
    map.set(target, temp)

    for (let key in target) {
        // 递归需要将当前对象key值 与 map对象传递进去
        temp[key] = deepClone(target[key], map)
    }
    return temp
}

const a = {
    name: 'sunshine_lin',
    hobbies: { sports: '篮球', tv: '雍正王朝' },
    works: ['2020', '2021']
}
a.key = a // 环引用(自己的key指向自己)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容