浅拷贝和深拷贝

1.浅拷贝的方法,只能拷贝一层数据,更深层次对象级别的只拷贝引用地址

for...in...

// (1)利用for...in...遍历对象,k表示对象属性名,obj[k]表示对象属性值
            var obj={
                id:1,
                name:"andy",
                other:{
                    age:18,
                    height:180,
                }
            }
            var o={}
            for(var k in obj){
                o[k]=obj[k]
            }
            // console.log(o)
            o.other.age=20
            console.log(obj)

Object.assign(拷贝给谁,需要拷贝的数据)  es6写法

// (2)使用Object.assign(拷贝给谁,需要拷贝的数据)实现浅拷贝
            var obj={
                id:1,
                name:"andy",
                other:{
                    age:18,
                    height:180,
                }
            }
            var o={}
            Object.assign(o,obj)
            o.other.age=20
            o.name="bob"
            console.log(o)
            console.log(obj)

 

2.深拷贝拷贝多层,每一层的数据都可以拷贝

(1)利用递归的方式实现深拷贝
// (1)利用递归的方式实现深拷贝
            var obj={
                id:1,
                name:"andy",
                other:{
                    age:18,
                    height:180,
                },
                color:['pink','red']
            }
            var o={}
            // 封装函数
            function deepCopy(newobj,oldobj){
                for(var k in oldobj){
                    // 判断属性属于那种数据类型
                    // 获取属性值 oldobj[k]
                    var item=oldobj[k]
                    // 判断是否是数组,数组要写在上面,因为数组也属于对象
                    if(item instanceof Array){
                        newobj[k]=[]
                        deepCopy(newobj[k],item)
                    }
                    // 判断是否是对象
                    else if(item instanceof Object){
                        newobj[k]={}
                        deepCopy(newobj[k],item)
                    }
                    // 判断是否是基本数据类型
                    else{
                        newobj[k]=item
                    }
                }
                // console.log(item)
            }
            deepCopy(o,obj)
            console.log("o"+o)
            o.color[1]='yellow'
            console.log("obj"+obj)

(2)JSON.parse(JSON.stringify(需要拷贝的对象))

局限性:拷贝的对象如果有函数、undefined,经过JSON.stringify序列化之后的字符串中这个键值对会消失;
​ 拷贝RegExp引用类型会变成空对象;

// JSON.parse(JSON.stringify())
            var obj={
                id:1,
                name:"andy",
                other:{
                    age:18,
                    height:180,
                },
                color:['pink','red']
            }
            var o={}
            o=JSON.parse(JSON.stringify(obj))
            o.color[1]='blue'
            console.log("o",o)
            console.log("obj",obj)

 

posted @ 2023-01-29 14:51  小闫的姑娘  阅读(11)  评论(0编辑  收藏  举报