js对象深拷贝

荒凉一梦 提交于 2019-12-11 07:26:07

js深拷贝和浅拷贝

js的深拷贝指的是基本数据类型,指的是变量1复制变量2的值后,改变变量2,不会影响变量1的值。
例如:

let num1 = 2;
let num2 = num1;
num2 = 3;
console.log(num1);// 2
console.log(num2);// 3

js的浅拷贝指的是引用数据类型,指的是将对象2复制对象1的值以后,改变的对象2的值以后,会将对象1的值也改变。原因是:(引用数据类型的拷贝,拷贝的是值,但是地址中的变量指向的依旧是一块地址。)
例如:

let obj1 = {
	name: 'lnj'
}
let obj2 = obj1;
obj2.name = 'zs';
console.log(obj2.name);// zs
console.log(obj1.name);// zs

为了解决上面那个对象的浅拷贝,让js对象能深拷贝,下面封装了一个方法
例如:

class Person{
	name = 'lnj';
	hobby = {
		cat: 'aa'
	},
	arr = [1, 3, 5];
}
let per = new Person();
let obj = new Object();
depCopy(obj, per);
function depCopy(target, source){
	for(let key in source){ // 遍历拿到source对象中所有的属性
		let sourceValue = source[key]; // 拿到当前属性对应的属性值
		if(sourceValue instanceof Object){ // 判断当前取值是否是引用类型
			let subTarget = new sourceValue.constructor;
			target[key] = subTarget;
			depCopy(subTarget, sourceValue);
		}else{
			target[key] = sourceValue;
		}
	}
}

以上代码全靠手打,如有错误,请下方留言。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!