关于JavaScript的浅拷贝和深拷贝

关于JavaScript的浅拷贝和深拷贝

在 JS 中有一些基本类型像是NumberStringBoolean

var a = 10;
var b = a;
b = 20
console.log(a)    // 10
console.log(b)    // 20

像这种基本类型的拷贝,就各自独立修改其中一个不会影响另一个。

 

而对象就是像这样的东西 [1,2,3]或者{name:1,age:2},对象跟基本类型最大的不同就在于他们的传值方式。

对象的传值方式是引用传值

浅拷贝例子

var a = [1,2,3]
var b = [];
b = a;		// 浅拷贝a
console.log(a === b);    // true
console.log(b)	// [1, 2, 3]
b[0] = 5;		// 改变拷贝过来的数组任意一个值
console.log(a)	// [5, 2, 3]	==> 原数组被改变了

结果输出:

上面的例子拷贝的其实是引用的内存地址,如果更改了其中任意一个对象的值,另外一个拷贝的对象也会被改变,这就是浅拷贝。

 

而在很多情况下我们这么做会存在很多问题,比如一个项目多个人开发,多个人都有用到这个对象,如果我们浅拷贝的话,改变了引用内存地址的值,其他开发人员就会出错,所以我们需要做深拷贝,拷贝出来的东西自己独立出来,不跟原对象冲突

使用:JSON的parse和stringify进行深拷贝

深拷贝例子:

var	a = [1,2,3,[4,5,6]];
var b = JSON.parse(JSON.stringify(a));
console.log(a === b)		// false
b[3][0] = 22;
console.log(a)
console.log(b)

结果输出:

这里使用JSON的parse和stringify方法拷贝出来的,就都是独立了,互不干扰。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值