美文网首页
手写深浅拷贝

手写深浅拷贝

作者: 杭州程序员小陈 | 来源:发表于2021-07-22 10:15 被阅读0次

    浅拷贝
    拷贝 目标对象的属性 引用类型地址
    实现浅拷贝的方式
    Object.assign({}, .obj)
    Array.slice()

    // 浅拷贝简单实现
    function clone(target) {
        if(target === null ) {
            return target
        }
        // 克隆 数组 和 对象
        let cloneTarget = Array.isArray(target) ? [] : {}
        for (const key in target) {
            if (target.hasOwnProperty(key)) {
                cloneTarget[key] = target[key]
            }
        }
        return cloneTarget
    }
    

    深拷贝
    拷贝 目标对象的属性
    深拷贝实现方式
    JSON.parse(JSON.stringify())
    虽说满足大部分的需求 但是有缺陷
    会忽略undefined
    会忽略sybmol
    会忽略函数
    不能处理循环调用
    通过深度循环递归来实现

    // 手动实现 深拷贝
    
    function isObject(params) {
      let type = typeof params
      return params !== null && (type === 'object' || type === 'function')
    }
    
    function forEach(params, fn) {
        console.log('parmas', params);
        let index = -1
        while (++index < params.length) {
            console.log(params);
            let key = params[index]
            fn(key)
        }
    }
    
    /**
     * 1. 判断是否 引用类型 不是 直接返回 
     * 2. 处理数组
     * 3. 处理循环引用
     * 4. 性能优化
    */
    function deepClone(target, map = new Map()) {
        
        // 1. 判断是否 引用类型 不是 直接返回 
        if (!isObject(target)) {
            return target
        }
    
        // 2. 处理数组
        let cloneTarget = Array.isArray(target) ? [] : {}
    
        // 3. 处理循环引用
        if(map.get(target)) {
            return map.get(target)
        }
        map.set(cloneTarget, target)
    
        // 4. 性能优化
        // for (const key in target) {
        //     if (target.hasOwnProperty(key)) {
        //         const element = target[key];
        //         cloneTarget[key] = deepClone(target[key], map)
        //     }
        // }
        let Keys = Array.isArray(target) ? undefined : Object.keys(target)
    
        forEach(Keys || target, (key) => {
            console.log(key);
            cloneTarget[key] = deepClone(target[key], map)
        })
    
    
        return cloneTarget
    }
    

    以上还有缺陷
    不能拷贝 map set
    不能拷贝 函数

    相关文章

      网友评论

          本文标题:手写深浅拷贝

          本文链接:https://www.haomeiwen.com/subject/oosemltx.html