IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    JS对象深浅拷贝

    zongyan86发表于 2020-11-12 03:05:07
    love 0

    浅拷贝
    1、简单实现

    for(let prop in obj){
      obj2[prop] = obj[prop];
    }
    

    2、assign

    Object.assign(obj2,obj);
    

    3、拓展运算符

    obj2 = {obj};
    

    4、

    let tmp = JSON.stringify(obj);
    obj2 = JSON.parse(tmp);
    

    深拷贝

    1、

    function  deepClone(origin){
                let target = origin.constructor === Array? []:{};//判断复制源为什么类型
                for(let prop in origin){
                    if(origin.hasOwnProperty(prop)){//是否为原型链上的属性
                        if(typeof origin[prop] == "object"){//判断是否为基本数据类型
                            origin[prop].constructor === Array ?  target[prop] = []:target[prop] = {};
                            target[prop] = deepClone(origin[prop]);//为引用数据类型 深层拷贝 递归调用自身   
                        }else{
                            target[prop] = origin[prop];//正常复制
                        }
                    }
                }
                return target;
    }
     obj2 = deepClone(obj);
    

    2、

    function  deepClone(origin){
                let toStr = Object.prototype.toString;//保存函数引用
                let arrayStr = "[object Array]"; //储存调用函数判断为数组时返回的值
                let target = toStr.call(origin) ==  arrayStr? []:{};//判断复制源为什么类型
                for(let prop in origin){
                    if(origin.hasOwnProperty(prop)){//是否为原型链上的属性
                        if(typeof origin[prop] == "object"){//判断是否为基本数据类型
                            toStr.call(origin[prop]) ==  arrayStr ?  target[prop] = []:target[prop] = {};
                            target[prop] = deepClone(origin[prop]);//为引用数据类型 深层拷贝 递归调用自身   
                        }else{
                            target[prop] = origin[prop];//正常复制
                        }
                    }
                }
                return target;
            }
    obj2 = deepClone(obj);
    

    3、jq $.extend(true,{},{})

    声明: 本文采用 BY-NC-SA 协议进行授权 | WEB开发分享
    转载请注明转自《JS对象深浅拷贝》



沪ICP备19023445号-2号
友情链接