JS深拷贝

1、递归拷贝

简化版只拷贝对象:

var a1 = {
            name: 'zhang3',
            age: 18,
            sex: 'man',
            children: {
                name: 'zhang4',
                age: 18,
                sex: ''
            }
        }
function DeepCopy1(Origin) {
            var Copy = {}
            for (var key in Origin) {
                if (typeof Origin[key] == 'object') {
                    Copy[key] = DeepCopy(Origin[key])
                } else {
                    Copy[key] = Origin[key]
                }
            }
            return Copy
        }

拷贝对象和数组:

var a2 = {
            name: 'zhang1',
            age: 18,
            sex: 'man',
            children: {
                name: 'zhang1',
                age: 18,
                sex: ''
            },
            friends: [{
                name: 'zhang1',
                age: 18,
                sex: 'man'
            }, {
                name: 'zhang1',
                age: 18,
                sex: 'man'
            }]
        }
function DeepCopy2(Origin) {
            //基本数据类型直接返回
            if (typeof Origin != 'object' || Origin==null) return Origin
                //判断引用类型为数组还是对象
            var Copy = Array.isArray(Origin) ? [] : {}

            for (var key in Origin) {
                //保证key不是原型中的属性
                if (Origin.hasOwnProperty(key)) { 
                    //引用类型继续递归
                    Copy[key] = DeepCopy2(Origin[key])
                }
            }
        }

2、JSON深拷贝:不能拷贝对象中的函数

//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone3(obj) {
  var _obj = JSON.stringify(obj),
    objClone = JSON.parse(_obj);
  return objClone;
}

3、JQuery深拷贝:第一个参数表示如果属性为引用类型会递归执行,第二个参数为拷贝容器,第三个为拷贝源


function deepCopy4(obj) {
            if (typeof obj != 'object') return obj
                //判断引用类型为数组还是对象
            var copy = Array.isArray(obj) ? [] : {}
            $.extend(true, copy, array)
            return copy
        }

4、Object.assign():缺点是只有顶层对象的第一层属性为深拷贝

var a3 = {
            name: 'zhang3',
            children: {
                name: 'zhang4'
            }
        }
        var b4 = {}
        Object.assign(b4, a3)
        b4.name = 'wang5'
        b4.children.name = 'wang6'
        console.log(a3, b4)

5、lodash.cloneDeep()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值