js对象深度克隆

       js对象克隆就是将一个对象的属性方法赋值给另外一个空对象,我们先来了解一下js对象。在js中一切实例皆是对象具体分为原始类型和合成类型,原始类型对象指的是Undefined 、Null 、Boolean 、Number 和 String ,按值传递,合成类型对象对象指的是array 、object以及function ,按址传递,传递的时候是内存中的地址。而对象的克隆拷贝也因此分为两种,浅度克隆和深度克隆,浅度克隆是指基本类型为值传递,对象仍为引用传递,深度克隆是指所有元素或属性均完全克隆,并于原引用类型完全独立,即就是在后面修改对象的属性的时候,原对象不会被修改,下面介绍几种对象深度克隆的方法。

1.遍历深度克隆法

function deepClone (obj) { 
    let newObj = {};  
    if (obj instanceof Array) {  
        newObj = [];  
    }  
    for (let key in obj) {  
        let val = obj[key];  
        newObj[key] = typeof val === 'object' ? cloneObj(val): val;  
    }  
    return newObj;  
};

换用toString()方法

function deepClone(origin, target) {
    var target = target || {};
    toStr = Object.prototype.toString, //对象调用toSting()
    arrStr = "[obect Array];"
    for(var prop in origin) {
    if(origin.hasOwnProperty(prop)) { //判断是否是原型上的属性还是自己的属性
      if(origin[prop] !== "null" && typeof(origin[prop]) == "object") { //判断是数组还是对象且复制者不能为空
        if(toStr.call(origin[prop]) == arrStr) {
          target[prop] = [];
        } else {
          target[prop] = {};
        }
          deepClone(origin[prop], target[prop]);
        } else {
          target[prop] = origin[prop];  //递归调用
        }
      }
    }
    return target;
  }

这种遍历克隆是通用的对象深度克隆,把obj的value当做只有普通值、数组和函数,先正常的处理,然后再考虑之前的普通值有可能是object,所以这里做个判断,在递归一下clone函数就可以了

2.对象序列化深度克隆

let newObj = JSON.parse(JSON.stringify(obj)

这种方法也常用于我们发请求拿到结果为字符串的时候需要对数据进行处理

3.ES6 Object.assign新方法

let newObj = Object.assign({}, obj)

这种ES6的方法是我们比较常见的深度克隆方法

4.ES6扩展运算符

let newObj = {...obj}

这种方法是将原obj对象首先转化为数组,然后在转化为对象,原理类似对象序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值