js 深拷贝方法

深拷贝浅拷贝的方法

浅拷贝

//Object 方法
 object.assign(target,source)// 将源拷贝到目标,切返回目标
 es6 扩展运算符
 //数组方法:
 slice ,concat,es6扩展运算符
复制代码

深拷贝的两个方法

  1. JSON序列化
let obj  = {a:2,b:{c:1}}
let str = JSON.strify(obj)
JSON.parse(str);
复制代码

JSON 存在几个问题,没法转化 是Date、Function、RegExp,不相信的同学可以试试,对象中有这几个类型的值,拷贝不出来 2.深层递归

function deepClone (obj){
    let  cloonObj = {};
    let ary = [];
    if(typeof obj !== "object"){

        return obj;
    }
    if(obj instanceof Array){
        for(let val of obj ){
            if(typeof val === "object"){
                ary.push(deepClone(val));
            }else {
                ary.push(val);
            }
        }
        return ary;
    } else {
        for(let key in obj){
            if( obj[key] instanceof Object){
                cloonObj[key] = deepClone(obj[key]);
            } else {
                cloonObj[key] = obj[key];
            }
        }
        return cloonObj;
    }
}
复制代码

上面代码 只因为 判断是数组还是Object,写的很冗余,精简一下 得到 如下

注意 注意 史上最简短的深拷贝代码来了

function  deepClone (obj){
    let t =  new obj.constructor
    if(obj instanceof Date) return new Date(obj);
    if(obj instanceof RegExp) return new RegExp(obj);
    if(typeof obj !== "object") return obj;
    for(let key in obj){
        t[key] = deepClone(obj[key]);
    }
    return t;
}

复制代码

验证下:


let  obj  =  {a:1,b:{c:2},d:[1,2],e:new RegExp(/\d+/),f:function(){console.log(1)},g:new Date()}

let  ObjCloone = deepClone(obj)
console.log(ObjCloone);

/*>>{ a: 1,
  b: { c: 2 },
  d: [ 1, 2 ],
  e: /\d+/,
  f: [Function: f],
  g: 2018-10-02T10:15:19.672Z }
  */


复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值