JavaScript-深浅拷贝

浅拷贝

            概念:浅拷贝即只复制对象的引用,所以副本最终也是指向父对象在堆内存中的对象,

            无论是副本还是父对象修改了这个对象,副本或者父对象都会因此发生同样的改变;

          方法:  

            + 简单赋值

            + 简单的遍历  

            + 扩展运算符

            + assign  

1.简单赋值

        let obj = {
            name: '张三',
            age: 18,
            o:{
                gender: '男',
            },
            arr:[10,20]
        }
        let  newObj = obj
        newObj.name = '李四'
        console.log(newObj)
        console.log('原始的',obj)

2.简单的遍历

let obj = {
            name: '张三',
            age: 18,
            o:{
                gender: '男',
            },
            arr:[10,20]
        }
        let newObj = {}
        for (let key in obj) {
            newObj[key] = obj[key]
        }
        // newObj.name = '李四'
        newObj.o.gender = '保密'
        console.log(newObj)
        console.log('原始的',obj)

3.扩展运算符

let obj = {
            name: '张三',
            age: 18,
            o:{
                gender: '男',
            },
            arr:[10,20]
        }
 {...obj}
        // newObj.name  = '李四'
        newObj.arr[0] = 500
        console.log(newObj)
           console.log('原始的',obj)

4. assign  

let obj = {
            name: '张三',
            age: 18,
            o:{
                gender: '男',
            },
            arr:[10,20]
        }
let newObj  = Object.assign(obj)
        newObj.name  = '李四'
        console.log(newObj)

        console.log('原始的',obj)

深拷贝

            概念:直接复制父对象在堆内存中的对象,最终在堆内存中生成一个独立的,与父对象无关的新对象。

           深拷贝的对象虽然与父对象无关,但是却与父对象一致。两者互不影响

           + json反序列化  

           + 递归遍历对象

           + lodash

           + 通过JQuery的extend方法实现深拷贝

1.json反序列化

 let obj = {
            name: '张三',
            fn: function () { },
            a: null,
            o: {
                gender: "男",
                obj1: {
                    age: 18
                }
            },
            arr: [10, 20]
        }
let newObj = JSON.parse(JSON.stringify(obj))

2.递归遍历对象

let obj = {
            name: '张三',
            fn: function () { },
            a: null,
            o: {
                gender: "男",
                obj1: {
                    age: 18
                }
            },
            arr: [10, 20]
        }
 function deepClone(obj) {
            // 判断是数组还是对象 然后给cloneObj赋值
            let cloneObj = Array.isArray(obj) ? [] : {}
            //  判断是不是对象还是数组
            if (obj && typeof obj == 'object') {
                // 第一层遍历
                for (var key in obj) {
                    // 如果是对象或者数组 让他继续遍历 
                    if (obj[key] && typeof obj[key] == 'object') {
                        cloneObj[key] = deepClone(obj[key])
                    } else {
                        cloneObj[key] = obj[key]
                    }
                }
            }
            return cloneObj
        }

3.lodash

let obj = {
            name: '张三',
            fn: function () { },
            a: null,
            o: {
                gender: "男",
                obj1: {
                    age: 18
                }
            },
            arr: [10, 20]
        }
        let  newObj = _.cloneDeep(obj)
        // console.log(newObj)

          newObj.o.gender = '女'
        newObj.o.obj1.age = 20
        newObj.arr[0] = 500
        console.log('拷贝的', newObj)
        console.log('原始的', obj)

 4.juquer

let targetObj = {
    id:1,
    msg:{
        sex:"男"
    }
}
 
let obj = {
    id:2,
    name:"小蜗",
    msg:{
        age:22
    }
}
 
$.extend(true,targetObj,obj)

以上便是所有内容,如有不对请留言指正~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值