小言_互联网的博客

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

407人阅读  评论(0)

分析:
浅拷贝只是拷贝一层,深拷贝可拷贝多层
意思就是一个对象里面有普通数据和对象或者数组,现在要拷贝它
浅拷贝就是拷贝普通数据和数组对象的地址,因为地址指向的是同一个所以拷贝之后,修改数组或者对象的数据,拷贝和被拷贝的都会发生变化.
深拷贝是拷贝了一个对象的所有内容,但是它是独立的,指向不同的地址.
浅拷贝:
(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)

记得点赞~啊


转载:https://blog.csdn.net/qq_43920865/article/details/106444687
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场