JavaScript的深拷贝和浅拷贝

1、深拷贝
修改新变量不会影响原本变量的值
默认情况下基本数据类型都是深拷贝

下面代码只适用于基本数据类型:

class Person{
			name="hrl";
			age=18;
		}
		let p1=new Person();

		//深拷贝
		let p2=new Object();//创建新的对象 在存储中开辟新的存储空间
		/*p2.name=p1.name;
		p2.age-p1.age;
		p2.name="zs";*/ //第一种方法不适合多条数据的时候

		/*for(let key in p1){
			p2[key]=p1[key];
		}
		console.log(p2);
		p2.name="zs"*/   //第二种方法

		Object.assign(p2,p1);
		p2.name="zs"
		console.log(p1.name);
		console.log(p2.name);  //推荐使用第三种方法

当不属于基本数据类型时,用上面的方法就不行了。

//不同数据类型 实现真正意义上的深拷贝 需要定义一个方法
		class Person{
			name="hrl";
			cat={
				age:18
			};
			score=[1,3,5];
		}

		let p1=new Person();
		let p2=new Object();

		depCopy(p2,p1);
		//console.log(p2);
		p2.cat.age=25;
		console.log(p1.cat.age);
		console.log(p2.cat.age);

		function depCopy(target,source){
			//通过遍历拿到source的属性
			for(let key in source){
				//console.log(key);//输出不同数据类型的名称 
				//获得当前数据类型的取值
				let sourceValue =source[key];
				//console.log(sourceValue);
				//判断当前的取值是否是引用数据类型
				if(sourceValue instanceof Object){
					//console.log(sourceValue);//如果引用了数据类型就输出
					//console.log(sourceValue.constructor);
					//console.log(new sourceValue.constructor);//判断创建的是对象还是数组
					let subTarget=new sourceValue.constructor;
					target[key]=subTarget;
					depCopy(subTarget,sourceValue);
				}else{
					target[key]=sourceValue;//没有引用就添加到p2这个对象中
				}

			}
		}

2、浅拷贝
修改新变量的值会影响原本变量的值
默认情况下引用类型都是浅拷贝

let p2=p1;
p2.name="zs";//修改变量中的值

你可能感兴趣的:(JavaScript基础)