js浅拷贝与深拷贝

浅拷贝:引用数据类型的拷贝是拷贝的内存地址

var person = {

    name:"lisi",

    age: 12,

   }

}

person 在栈里面存的是一个内存地址(指向堆里面的对象数据)

var p2 = person; // person相当于把内存地址赋值给了p2,这是p2和person就指向了堆内存的同一个对象数据。

var p2 = person // 引用数据类型的拷贝都是拷贝的内存地址(浅拷贝)

// console.log(p2 === person); // 对象的比较是比较内存地址,地址相同返回true,不相同返回false。

p2.name = "lisi"; //  // p2是一个内存地址,改变的是p2的内存地址指向的对象的name

console.log(person.name); // person和p2是通一个内存地址,所以person使用的对象就是p2改过的对象。


 深拷贝,就不是拷贝内存地址,而是直接拷贝数据。

var p3 = {}; // 创建一个空对象,把persion的所有属性拷贝到空对象里面。

for(var o in person){

p3[o] = person[o];

}

console.log(p3);

递归实现多层深拷贝:

 var p1 = {
                name: "zhang san",
                age: 22,
                family:{
                    address: "guangzhou bai yun qu",
                    number: 12,
                    phone: 1333333333
                } 
            }
            function deepCopy(newObj,obj){
                for(var o in obj){
                    if(obj[o] instanceof Object){
                        newObj[o] = {};
                        deepCopy(newObj[o],obj[o]);
                    }
                    else if(obj[o] instanceof Array){
                        newObj[o] = [];
                        deepCopy(newObj[o],obj[o]);
                    }
                    else{
                        newObj[o] = obj[o];
                    }
                }
            }
            var p2 = {}
            deepCopy(p2,p1)
            p1.family.address = "襄阳"
            console.log(p2,p1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值