深拷贝与浅拷贝

 引用类型与值类型的储存特征:

(1)内存逻辑结构(画图)

(2)赋值:值类型两个数据,引用类型是两个变量一个数据

var number = 123;

Var num2 = num;

*值类型赋值的存储特点,将变量内的数据全部拷贝一份,存储给新的变量

*‘var num = 123’表示变量中存储的数字是123

*然后将数据拷贝一份,就是将123拷贝一份,那么内存中有两个数组

*将拷贝数据赋值给‘num2’

*其特点是在内存中有两个数据副本

 深拷贝与浅拷贝

深拷贝:如果拷贝的时候,将数据的所有结构都拷贝一份,那么数据在 内存中独立就是深拷贝,完全隔离

浅拷贝:如果拷贝的时候,只针对当前对象的属性进行拷贝,不考虑属 性是否为引用类型那么就是浅拷贝,存在共享

拷贝:复制一份,指将对象数据复制

在讨论深拷贝与浅拷贝的时候一定要保证对象的属性也是引用类型

操作DOM 时不能使用浅拷贝

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script>
		var car = {name:'法拉利'};
		var p = {name:'张三', age: 19, car: car};
		
		
		//var pCopy = p;  这个不是拷贝,没有对对象做任何拷贝行为
		//浅拷贝的代码实现
		
//		var pCopy = {};
//		pCopy.name = p.name;
//		pCopy.age = p.age;
//		pCopy.car = p.car;
		
		
		//深拷贝的代码实现
		
//		var pCopy = {};
//		pCopy.name = p.name;
//		pCopy.age = p.age;
//		pCopy.car = {};
//		pCopy.car.name = p.car. name;
//		
		
		
		//浅拷贝
//		var p = {
//			name: '张三',
//			age: 19,
//			gender: '男',
//			copy: function (o) { //将当前对象拷贝一份
//				//1.创建对象
//				var temp = {};
//				//2.复制属性,在 copy 中使用 this 表示当前对象
//				for (var k in this) {
//					temp[ k ] = this[ k ];
//				}
//				//3.返回对象
//				return temp;
//				//需要返回对象
//			}
//		};
//		 
//		
//		 var p2 = p.copy();
//		 
//		 
//		 p.name = '李四';
//		 p.age = 20;
//		 p.genter = '女';
//		 
//		 
//		 
//		 
		
//		 var car = {name: '法拉利',
//		 	deepCopy: function () {
//		 		//假设copy已经写好
//		 		//1.创建一个对象
//		 	 	var temp = {};
//		 	 	//2.拷贝属性,在判断如果是引用类型需要拷贝
//		 	 	for (var k in this) {
//		 	 		if (typeof this[ k ] === 'object') {
//		 	 			temp[ k ] = this [ k ].deepCopy();
//		 	 		}
//		 	 		else {
//		 	 			temp[ k ] = this [ k ];
//		 	 		}
//		 	 	}
//		 	 	//3.返回对象
//		 	 	return temp;
//		 	}
//		 };
//		 var p = {name: '张三', car: car,
//		 	 deepCopy: function () {
//		 	 	//1.创建一个对象
//		 	 	var temp = {};
//		 	 	//2.拷贝属性,在判断如果是引用类型需要拷贝
//		 	 	for (var k in this ){
//		 	 		if (typeof this[ k ] === 'object') {
//		 	 			temp[ k ] = this[ k ].deepCopy();
//		 	 		}
//		 	 		else {
//		 	 			temp[ k ] = this[ k ];
//		 	 		}
//		 	 	}
//		 	 	//3.返回对象
//		 	 	return temp;
//		 	 }
//		 }
		 //需要保证所有的对象中都有copy 方法那么就可以简化了
		 // 写一个deepCopy函数,每一个对象都用<对象>.deepCopy = deepCopy,来使得当前对象具有拷贝的方法,那么就可以实现深拷贝了
		 
		 
		 
		 
		 //深拷贝
		 
		 var deepCopy = function () {
		 	 	//1.创建一个对象
		 	 	var temp = {};
		 	 	//2.拷贝属性,在判断如果是引用类型需要拷贝
		 	 	for (var k in this ){
		 	 		if (typeof this[ k ] === 'object') {
		 	 			temp[ k ] = this[ k ].deepCopy();
		 	 		}
		 	 		else {
		 	 			temp[ k ] = this[ k ];//值类型直接拷贝
		 	 		}
		 	 	}
		 	 	//3.返回对象
		 	 	return temp;
		 	 }
		 
		 var car = {name: '法拉利'};
		 var p = {name: '张三', age: 19, gender:'男',car: car };
		  
		 
		 //让所有的对象都有拷贝的方法
		car.deepCopy = deepCopy;
		p.deepCopy = deepCopy;
		var newP = p.deepCopy();
		
		p.name = '李四';
		p.age = 20;
		p.genter = '女';
		p.car.name = '兰博基尼';
		
		
		
		
	</script>
</html>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值