实现深拷贝的几种方式

1. JSON.stringify()以及JSON.parse()

但是这种方法是不可以拷贝 undefined , function, RegExp 等等类型的

var obj5 = {
    a: 1,
    b: 2,
    c: 3
}
var objString = JSON.stringify(obj5);
var obj6 = JSON.parse(objString);
obj5.a = 5;
console.log(obj5.a);  // 5
console.log(obj6.a)  //1
2. 递归拷贝

这种方法可以拷贝function,但是不可以拷贝 undefined , RegExp 等类型的

/**
 * 引用类型拷贝的规则是浅拷贝
 * 要实现一个深拷贝
 */
const obj1 = {
    age: 20,
    name: '王明洁',
    address: {
        city: '杭州'
    },
    arr: ['a', 'b', 'c']
}

const obj2 = deepClone(obj1)
obj1.address.city = '上海'
console.log(obj2.address.city)  //杭州

/**console.log(obj2.address.city)
 * 深拷贝
 * @param {Object} obj 要拷贝的对象
 */
function deepClone(obj={}){
    /* 1.判断是基本类型还是引用类型 */
    /* 如果不是对象和数组,或者为null,没有必要做深拷贝,直接返回 */
    if(typeof obj !== 'object' || obj == null) {
        return obj
    }
    /* 判断是数组还是对象 */
    /* 初始化返回结果,如果obj是数组,则返回数组格式,如果obj是对象,则返回对象格式 */
    let result
    if(obj instanceof Array) {
        result = []
    } else {
        result = {}
    }

    /* 递归 */
    /* 返回结果 */
    for(let key in obj) {
        /* 判断一下key是不是obj自己拥有的属性,保证key不是原型的属性 */
        if(obj.hasOwnProperty(key)) {
            //递归调用
            result[key] = deepClone(obj[key])  
        }
    }
    return result
}
注意: Object.assign(target, source)不是深拷贝

这种方法对于一层对象来说是没有问题的,但是如果对象的属性对应的还是对象或者数组时,就不能实现了

var obj5 = {
    a: 1,
    b: ['a', 'b'],
    c: {x: 100, y: 200}
}
var obj6 = Object.assign({}, obj5)
obj5.a = 5;
obj5.b[1] = 'c'
obj5.c.x = 900
console.log(obj5.a);  // 5
console.log(obj6.a)  //1

console.log(obj5.b[1]) //c
console.log(obj6.b[1]) //c

console.log(obj5.c.x) //900
console.log(obj6.c.x) //900
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值