Js中的深拷贝和浅拷贝

深拷贝和浅拷贝对比

拷贝分为两种情况:一个值,一个地址 基本类型拷贝:

var a=10;
var b=a
// 更换值,a,b互不影响
引用类型拷贝:

var a=[10];
var b=a;
b=[20]//这里是给b一个新的地址
console.log(a)//打印结果为10

var a=[10];
var b=a;
b.push(20)//这里在b原有的地址上加了20
console.log(a)//打印结果为[10],[20]

引用类型直接复制(或赋值)称为浅拷贝。 引用类型内部的值的赋值,与地址无关,称为深拷贝

【补充: 假设B复制了A,修改A的时候,看B是否发生变化:

如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)

如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)

浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,

深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,

使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。

深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。】

Object.assign()//将一个或多个原对象的属性复制给目标对象。 用法:

var obj1={a:1,b:2};
var obj={};
Object.assign(obj,obj1);
console.log(obj)//打印值为{a:1,b:2}
obj.a=10;
console.log(obj1)//打印值为{a:1,b:2}
 var obj1={a:[1],b:2};
var obj={};
Object.assign(obj,obj1);
console.log(obj)//打印值为{a:1,b:2}
obj.a.push(2);
console.log(obj,obj1)//打印值为{a:[1,2],b:2}{a:[1,2],b:2}
var obj1={a:[1],b:2};
var obj2={c:3,d:4};
var obj={}
object.assign(obj,obj1,obj2)
console.log(obj)//打印值为:{a:[1],b:2,c:3,d:4}
var obj1={a:[1],b:2};
var obj2={a:3,d:4};
var obj={}
object.assign(obj,obj1,obj2)
console.log(obj)//打印值为:{a:3,b:2,d:4}证明如果有重复的值名,后面会覆盖前面的。
Objext.defineProperty()定义一个对象的属性,这些属性具有可配置性。

var obj={}
Objext.defineProperty(obj,'a',{
    value:1
})
console.log(obj)//打印结果{a:1}
var obj={}
Objext.defineProperty(obj,'a',{
   value:1
   enumerable:true//默认不可遍历,加上 enumerable:true允许遍历
})
console.log(obj)//打印结果{a:1}
for(var i in obj){
   console.log(i)//打印结果为a
}
//Writable:true可修改,false不可修改
//Configurable:false  不可删除,true可删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值