js浅拷贝深拷贝

浅拷贝和深拷贝的基本概念

今天无意间又看到了这个知识点,那就写写笔记及小结,有时可能理解了一个知识点并不够,亲自讲清楚给别人听才是真正的消化并提高。
还是亲手画一张草图先捋清楚概念。(首先搞清楚浅拷贝和深拷贝的概念是在引用类型这个分支下面的,它们和基本类型没有啥关系)

基本类型和引用类型

在这里插入图片描述
关于基本类型引用类型的介绍网上已经有很多介绍了,那这里我就简单举两个例子带过。

  • 基本类型
var a=1;

var b=a;

a=2;

console.log(b);

控制台打印了1没问题。(改变了a的值b不会跟着改变)
在这里插入图片描述

这里直观的画张图看看这个过程

在这里插入图片描述

  • 引用类型
var c={
	age:3
}

var d=c

c.age=4

console.log(d.age);

在这里插入图片描述
这里控制台打印了4而不是3,可是我明明修改的c的age值,d的age为什么也跟着改变呢。这是因为我们引用类型它仅是拷贝了c对象指向它堆内存的指针。

这里还是直观的画张图看看这个过程

首先var c={age:3}
在这里插入图片描述
接着var d=c
在这里插入图片描述
我们可以观察到并没有单独为d变量在堆中再创造一份一模一样的数据,只是把c指向堆内存数据的指针多复制了一份,它们指向同一块内存地址,所以当我们c.age=4时会发现打印出b.age的值也是4。

那如果我们不想让c和d指向同一块内存地址而是想重新给d新造一块内存地址让他俩互不干扰那该咋整呢。

这时就需要浅拷贝和深拷贝了

浅拷贝和深拷贝

搞清楚基础类型和引用类型之后我们就可以看看浅拷贝和深拷贝了。
还是先画张图(看到最后再回到这里仔细看这张图很快就懂了)
在这里插入图片描述

  1. 赋值

我们刚刚对引用类型的复制就是表格中的第一个“赋值”操作
它和原数据指向同一对象,数据中的子对象改变原数据也会一同改变。那我们就来新增一个子对象other看看

var c={
	age:3,
	other:{
		hobby:"play basketball",
		birthday:1997,
		height:"177cm",
		weight:"63kg"
	}
}

var d=c

c.age=4
c.other.height="180cm"

console.log(d.age);
console.log(d.other.height);

果然子对象也会跟着改变
在这里插入图片描述

  1. 浅拷贝

浅拷贝就是拷贝一层数据
我们这里用Object.assign方法来实现一次浅拷贝看看效果

var c={
	age:3,
	other:{
		hobby:"play basketball",
		birthday:1997,
		height:"177cm",
		weight:"63kg"
	}
}

var d=Object.assign({},c)//浅拷贝操作

c.age=4
c.other.height="180cm"

console.log(d.age);
console.log(d.other.height);

在这里插入图片描述
再对照着表格看浅拷贝实际只拷贝了一层,所以这里修改了c.age并不会影响到d.age的值。

  1. 深拷贝

深拷贝就是拷贝多层数据
我们这里用JSON.parse(JSON.stringify())方法来实现一次深拷贝看看效果

var c={
	age:3,
	other:{
		hobby:"play basketball",
		birthday:1997,
		height:"177cm",
		weight:"63kg"
	}
}

var d=JSON.parse(JSON.stringify(c))//深拷贝的实现

c.age=4
c.other.height="180cm"

console.log(d.age);
console.log(d.other.height);

再回到控制台看看结果
在这里插入图片描述
看到这里再回去看那张表格相信你会豁然开朗。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值