关于数组对象的深拷贝和浅拷贝

321 阅读1分钟

当我们复制一个基本数据类型的数据时,是新建一个数据同时存放到栈内存中,而当我们复制一个引用数据类型时,是复制这个引用数据类型的地址,存放到栈内存中,此时堆内存中并没有任何变化

这就引发了浅复制和深复制

关于深浅复制,虽然早就看过相关的博客文章,但是真正遇到的时候,依然忘记了往这上面找原因,导致浪费了些时间,所以我又重新了解了一下深浅复制的原因及深复制的方法。具体的原理大家应该都清楚,在这里我就不详细说了。

一,引发浅复制的操作

例如,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;
};