js 浅拷贝 实现深拷贝

对于基础的引用数据类型,在进行赋值的时候往往容易碰到修改原数据的值的时候,被赋值的数据也跟着修改了。
这就要了解数据存储机制,分为栈和堆,对于引用数据类型,如数组(Arrey)或对象(Object),栈里面存数据的名字
而堆里面存值,数据名通过指针找到堆里面的数据。前面的问题就是数据的浅拷贝和深拷贝

浅拷贝

在对引用数据类型赋值时,浅拷贝其实只是拷贝了指针而已。若堆内数据的值改变,而此时指针指向并未改变,
所以被赋值的变量的值也会发生改变,这就是浅拷贝造成的问题,下面上代码实例
let a = [1,2,3];
let b = a; // b = [1,2,3]
console.log(b); // [1,2,3]
a[0] = 4;
console.log(b); // [4,2,3]

深拷贝

先介绍一些简单的单层数据的深拷贝方式:
// concat
let arr3 = arr1.concat(arr2);
// slice
let arr1 = arr.slice(0,2);
// 结构运算符
let a = [1,2,3]
let b = [...a]
// 结构赋值
let [a] = [1,2,3]  // a=1
// 面对多层数据结构时
let obj = {
	a: 1,
	b: {
		c: 3
	}
}
let obj1 = {...obj}
console.log(obj1.b.c) //  3
obj.b.c = 0;
console.log(obj1.b.c) //  0

这些方式只对一层的数据结构有用,而平时在最项目时所用的数据或对象都会在里面嵌套很多层下面就介绍些多用于复杂数据结构的深拷贝:

//使用递归循环赋值,就是一层一层的循环
//然后每个赋值,太难得写了,不符合程序员的气质
// 通过JSON转换来赋值
let arr = [1,2,[3,4,[5]],[6]];
let a = JSON.stringfy(arr);
let arr1 = JSON.parse(a);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值