深拷贝与浅拷贝及相关拷贝方法

文章详细解释了JavaScript中深拷贝和浅拷贝的概念,举例说明了两者之间的区别。浅拷贝只复制引用,改变其中一个会影响另一个。深拷贝则创建新对象,确保修改互不影响。文中提到了两种深拷贝方法:使用`Object.assign`(在处理引用类型时需递归处理)和通过`JSON.parse(JSON.stringify())`转换实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简单来说,深拷贝和浅拷贝都是针对引用类型,js中,如Object,Array,Date类型等
2.浅拷贝:复制过去的是同一内存地址,变量之间所做的更改,各自影响彼此
如:

var arr1=[0,1,2]
	var arr2=arr1
arr2[0]==100	
console.log(arr1)//[100,1,2]
console.log(arr2)//[100,1,2]

3.深拷贝,值赋值,但内存地址不同,即相当于新建了一个对象副本,各自互不影响,彼此独立
如:

 var arr1 =[0,1,2]
        var arr2 =[];
        arr1.forEach((item,index)=> arr2[index]=item)
        arr2[0]=100
        console.log(arr1)//[0,1,2]
		console.log(arr2)//[100,1,2]

4.深拷贝方法
①Object.assign(target, …sources)
target目标对象,即拷贝赋值对象 ;sources传值对象,源对象
sources源对象中属性的content不包含引用类型时,target直接获得深拷贝对象
但当sources中某一属性的content为引用类型时,需进行递归遍历,将其变为基本类型赋值
如:

ob1={a:1, b:2, c:3  }
ob2={}
Object.assign(ob2, ob1)
ob1.a=2
console.log(ob1,ob2)  // {a: 2, b: 2, c: 3}    {a: 1, b: 2, c: 3}

属性中又含有引用类型,object

ob1={a:1,b:2,c:{value:3 }}
ob2={}
Object.assign(ob2, ob1)
ob1.a=33333
ob1.c.value=2
console.log(ob1,ob2)  // {a: 33333, b: 2, c: {value:2}}   {a: 1, b: 2, c: {value:2}}

此时,ob2中属性c中的属性会随着ob1中的属性c变化而变化,因为赋值过来的是引用类型,object
而属性a的值不会随着ob1中的属性a的值变化而变化,因为赋值过来的是基本类型,number

②简单的深拷贝方法,通过JSON.parse(JSON.stringify(ob1))实现,先将对象转为字符串,再进行解析,相对于新建了一个属性名和值都相同的新对象,从而实现深拷贝

var ob1={a:1,b:2,c:{value:3 }}
if(ob1){
    var ob2=JSON.parse(JSON.stringify(ob1))
    ob1.a=33333
    ob1.c.value=2
    console.log(ob1,ob2)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值