11.深浅拷贝

32 阅读2分钟

指的是对对象或者数组的拷贝,为了实现拷贝后修改其中一个另一个不受影响。

浅拷贝

就是利用for in将一个对象中的内容都复制一份放到新的对象中。
如果这个对象只要一层结构的话,修改新对象中的数据,原对象不会受影响
但是如果对象有多层机构的话,修改其中一个另一个也会受影响。
//要被拷贝的对象
let o1 = {
    name:'rose',
    age:20,
    love:{
        eat:'fruit'       
        }
}
//准备一个新的对象接收要拷贝的数据
let o2 = {}
//遍历要拷贝的数据
for(let k in o1){
    o2[k] = o1[k]
}
//这种情况下,修改新对象第一层的结构中的数据,原对象不会受到影响;但是修改第二层的结构中的数据,那原对象中的数据也发生相应的变化。

深拷贝

就是利用for in和递归函数将一个对象中的内容都复制一份放到新的对象中。
深拷贝的情况下,其中一个对象里面的数据发生变化不会影响到另一个对象。
        const o1 = {
            name: 'Jack',
            age: 18,
            info: {
                height: 180,
                weight: 180,
                desc: {
                    message: '今天天气很好',
                    a: {
                        b: 100,
                        c: {
                            d: 200
                        }
                    }
                }
            },
            address: {
                city: '北京'
            },
            hobby: ['吃饭', '睡觉', ['打王超',['666']]]
        }
        //准备一个一样的数据类型
        let o2 = {}
        //利用递归函数,在函数内部调用
        function deepCopy(o2,o1){
            for(k in o1){
                // 判断要拷贝的是不是对象
                if (Object.prototype.toString.call(o1[k]) === '[object Object]') {
                    // 能执行到这里说明是一个对象数据类型
                    // 需要再次创建一个对象
                    o2[k] = {}
                    deepCopy(o2[k],o1[k])
                // 判断要拷贝的是不是数组
                }else if(Object.prototype.toString.call(o1[k]) === '[object Array]'){
                    o2[k] = []
                    deepCopy(o2[k],o1[k])
                }else{
                    o2[k]=o1[k]
                }      
        }
还有一种实现深浅拷贝的方式,就是利用JSON数据格式
第一步:
    把js数据类型转换成JSON数据类型 let res = stringify(o1)
第二步:
    就是把JSON格式数据转成js格式数据 let o2 = JSON.parse(JSON.stringify(o1))

自执行函数

就是函数自己调用自己 (function name(){})()