当我们复制一个基本数据类型的数据时,是新建一个数据同时存放到栈内存中,而当我们复制一个引用数据类型时,是复制这个引用数据类型的地址,存放到栈内存中,此时堆内存中并没有任何变化
这就引发了浅复制和深复制
关于深浅复制,虽然早就看过相关的博客文章,但是真正遇到的时候,依然忘记了往这上面找原因,导致浪费了些时间,所以我又重新了解了一下深浅复制的原因及深复制的方法。具体的原理大家应该都清楚,在这里我就不详细说了。
一,引发浅复制的操作
例如,push,直接赋值等
二,深复制的方法如下:
1.JSON.parse(JSON.stringify(xx)),进行深复制;先将数组或对象字符串化,这样就可以切断指针联系
const arrayA = [1,2]
const arrayB = JSON.parse(JSON.stringify(arrayA))
复制代码
!Object.assign({},obj)(貌似没用,只是一级属性复制,比浅拷贝多了一层而已,但是达不到深拷贝)
2. concat()
const arrayA = [1,2]
const arrayB = arrayA.concat();
复制代码
3. 扩展运算符
const arrayA = [1,2]
const arrayB = [...arrayA];
const [...arrayB] = arrayA;
复制代码
4. 递归处理
function deepClone(data) {
var str, obj = data.constructor === Array ? [] : {};
if (typeof data !== 'object') {
return data;
} else {
for (var i in data) {
obj[i] = typeof data[i] === 'object' ?
deepClone(data[i]) : data[i];
}
}
return obj;
};
复制代码