对于基础的引用数据类型,在进行赋值的时候往往容易碰到修改原数据的值的时候,被赋值的数据也跟着修改了。
这就要了解数据存储机制,分为栈和堆,对于引用数据类型,如数组(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);