深拷贝和浅拷贝

91 阅读1分钟
深拷贝和浅拷贝针对对象和数组

浅拷贝

浅拷贝:将对象和数组复制一份,放到另一个变量中,新变量与原数据不公用一个地址。如果数据中还有引用数据,
       浅拷贝后,其中的引用数据会和原数据公用一个地址。
       
var obj = {
    name:'张三',
    age:12,
    wife:{
        name:'如花',
        age:11
    }
}
var pbj = {}
for(var key in obj){
    pbj[key] = obj[key]
}
console.log(pbj)
console.log(obj === pbj)    //flase,不公用一个地址
obj.wife.name = '似玉'
console.log(obj)  
console.log(pbj)           //obj改变了,pbj也改变了,说明数据中还有引用数据wife,
                             浅拷贝后,其中的引用数据还是会公用一个地址

深拷贝

深拷贝:将数组合对象复制一份,放到另一个变量中,新变量与原数据公用一个地址。如果数据中还有引用数据,
       深拷贝后,其中的引用数据不会和原数据公用一个地址
       
var obj = {
    name:'张三',
    age:12,
    wife:{
        name:'如花',
        age:11
    }
}
function cloneObj(obj) {
    if({}.toString.call(obj) === '[object Array]') {         //判断obj的类型是否是数组,如果是,
                                                               输出空数组s
    var s = []
    }else if({}.toString.call(obj) === '[object Object]') {  //判断obj类型是否是对象,如果是,
                                                               输出空对象s
    var s = {}
    }
    for(var key in obj){
        if(typeof obj[key] === 'object'){
            s[key] = cloneObj(obj[key])
        }else {
            s[key] = obj[key]
        }
    }
    return s
}
var pbj = cloneObj(obj)
console.log(obj === pbj)      //flase
obj.wife.name = '似玉'  
console.log(obj)  
console.log(pbj)             //obj改变了,pbj没有改变,说明如果在数据中还有引用数据,深拷贝后,
                               其中的引用数据也不会共用一个地址。