浅谈深拷贝与浅拷贝

个人认为,深拷贝与浅拷贝是针对引用类型提出的,对于基本数据类型不存在,深拷贝与浅拷贝。

任何编程语言的内存分区几乎都是一样的,分为栈区(堆栈),堆区,全局静态区,只读区(常量区和代码区),PHP、js和python是这样。

基本类型和引用类型在内存上存储的区别

var age = 25;
var arr = [1,2,3,4];
var obj = {
       attr1:1,
       attr2:2,
       attr3:3,
       attr4:4
}

浅谈深拷贝与浅拷贝_第1张图片

在上述函数中,age是基本类型,arr和obj是引用类型。age的名称和值都在栈区,arr和obj的名称在栈区,值却在堆区,在栈区只保留了一个堆区的相关地址。

到底什么是基本类型和引用类型

基本类型:就是值类型,即在变量所对应的内存区域存储的是值,如:上面的age变量所对应的内存存储的就是值25。

引用类型:就是地址类型。何为地址:地址就是编号,要地址何用,就是为了容易找到。生活中快递就是通过地址准确送达的。

到底什么是深拷贝和浅拷贝?

浅拷贝就是只拷贝了变量对应的地址,并没有在堆内存中产生新的结果。

var age = 25;
var arr = [1,2,3,4];
var obj = {
       attr1:1,
       attr2:2,
       attr3:3,
       attr4:4
}
var copyArr = arr;
var copyObj = obj;

 

浅谈深拷贝与浅拷贝_第2张图片

上述copyArr和copyObj是拷贝的arr、obj的值,他们对应的地址是一样的。因此他们的值也是一样的,无论是修改copyArr还是arr,输出的结果是一样的。

如何实现深拷贝?

Array.prototype.copyself = function(){
            let arr = new Array() ;
            for(let i in this){
                arr[i]= this[i]
            }
            return arr;
        }
        Object.prototype.copyself = function() {
            let obj = new Object();
            for(let i in this) {
                obj[i] = this[i]
            }
            return obj;
        }
        var p = {
            id: "007",
            name:"刘德华",
            readings: new Array("三国演义","红楼梦","水浒传"),
            other:{
                height:'180cm',
                weight:'80kg',
                age:55
            }
        }
        function copyOjb(obj) {
            let newObj = {};
            for(let i in obj) {
                if(typeof obj[i]=='object') {
                    newObj[i] = obj[i].copyself();
                } else {
                    newObj[i] = obj[i];
                }
            }
            return newObj;
        }
        var newP = copyOjb(p);
        newP.name = '马德华';        
        newP.readings[2] = '西游记';
        newP.other.weight = '88kg'
        console.log(p);
        console.log(newP)

 

浅谈深拷贝与浅拷贝_第3张图片输出结果

还有一种方式:

var p = {
            id: "007",
            name:"刘德华",
            readings: new Array("三国演义","红楼梦","水浒传"),
            other:{
                height:'180cm',
                weight:'80kg',
                age:55
            }
        }
let newP = JSON.parse(JSON.stringify(p));
newP.name = '马德华';        
newP.readings[2] = '西游记';
newP.other.weight = '88kg'
console.log(p);
console.log(newP)

 

浅谈深拷贝与浅拷贝_第4张图片输出结果

你可能感兴趣的:(浅谈深拷贝与浅拷贝)