浅拷贝和深拷贝(代码详解)

分析:
浅拷贝只是拷贝一层,深拷贝可拷贝多层
意思就是一个对象里面有普通数据和对象或者数组,现在要拷贝它
浅拷贝就是拷贝普通数据和数组对象的地址,因为地址指向的是同一个所以拷贝之后,修改数组或者对象的数据,拷贝和被拷贝的都会发生变化.
深拷贝是拷贝了一个对象的所有内容,但是它是独立的,指向不同的地址.
浅拷贝:
(1) 使用循环拷贝
(2)使用Object.assign()拷贝(es6中的)

var names = {
            a: "javascript",
            b: "HTML",
            msg: {
                c: "CSS"
            }
        }
        var obj = {};
        //1:简单的拷贝方法assign函数
        Object.assign(obj,names)
        //2:原生的方法
        for (var key in names) {
            //k 属性名 names[key]属性值 给obj添加属性
            obj[key] = names[key]
        }
        (上面方法二选一)
        console.log(obj)
        //修改obj中的C 看指向同一地址的names改变不
        obj.msg.c = "css3"
        console.log(obj.msg.c, names.msg.c)

深拷贝
(1)代码少的可以使用JSON.stringify()实现

//深拷贝拷贝很多层,每一级别都会拷贝
        var names = {
            a: "javascript",
            b: "HTML",
            msg: {
                c: "CSS"
            },
            do: ["H5", "css3"]
        }
        var obj = JSON.parse(JSON.stringify(obj));
        console.log(obj)
        //修改obj中的C 看指向同一地址的names改变不
        obj.msg.c = "css3"
        console.log(obj.msg.c, names.msg.c)//不同就是深克隆

(2)使用递归实现深克隆

//深拷贝拷贝很多层,每一级别都会拷贝
        var names = {
            a: "javascript",
            b: "HTML",
            msg: {
                c: "CSS"
            },
            do: ["H5", "css3"]
        }
        var obj = {};
        //   封装函数
        function deepCopy(newsobj, oldobj) {
            for (var k in oldobj) {
                //判断属性属于那种属性
                //获取属性
                var item = oldobj[k];
                // 判断这个值是否是数组
                if (item instanceof Array) {
                    newsobj[k] = [];
                    deepCopy(newsobj[k], item)
                } else if (item instanceof Object) {
                    //判断是对象
                    newsobj[k] = {};
                    deepCopy(newsobj[k], item)
                } else {
                    //简单数据
                    newsobj[k] = item;
                }
            }
        }
        deepCopy(obj, names)
        console.log(obj)
        //修改obj中的C 看指向同一地址的names改变不
        obj.msg.c = "css3"
        console.log(obj.msg.c, names.msg.c)

记得点赞~啊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值