日期:2014-05-16  浏览次数:20339 次

javascript---对象和函数的引用、浅拷贝、深拷贝、递归

1、javascript 对象和函数的引用

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>javascript 对象和函数的引用、浅拷贝、深拷贝、递归</title>
	<script type="text/javascript">
		//对象和函数都是对象引用的关系,a和b公用一个地址
		//所以当b改变也会影响a
		var a=[1,2,3];
		var b=a;//同一个引用
		b.push(4);
		alert(b);//1 2 3 4 
		alert(a);//1 2 3 4 对象的引用


		var a=[1,2,3];
		var b=a;
		b=[1,2,3,4];//b又重新的占用了一个新地址,与之前的进行脱离了,一个新的空间
		alert(b);//1 2 3 4
		alert(a);// 1 2 3没有引用到


		var obj={
			a:10
		}
		var obj2=obj;
			obj2.a=20;
		alert(obj.a);//20 影响到了之前的对象




	</script>
</head>
<body>
	
</body>
</html>

2、浅拷贝实现:

		//浅拷贝
		var obj={
			a:10
		}
		function copy (obj) {
			//复制关系,而不是引用关系
			var newOBJ={};
			for (var arrt in obj) {//循环复制所有属性,可以称为浅拷贝或者叫浅克隆
				newOBJ[arrt]=obj[arrt];
			};
			return newOBJ;
		}

		var obj2=copy(obj);
		obj2.a=20;
		alert(obj.a);//10


浅拷贝存在的问题只能拷贝一层

		//浅拷贝的问题:只能拷贝一层
		////举例验证-->
		var obj={
			a:{b:10}
		}
		function copy (obj) {
			var newOBJ={};
			for (var arrt in obj) {
				newOBJ[arrt]=obj[arrt];
			};
			return newOBJ;
		}
		var obj2=copy(obj);
		obj2.a.b=20;
		alert(obj.a.b);//20



==========================================================================
3、深拷贝(深拷贝要利用到递归知识)解决了浅拷贝只能拷贝一层的问题!

//递归(函数调用函数自身)
		//判断终止条件,可以执行return动作
		function jiechen (n) {
			if(n==1){
				console.trace();
				return 1;
			}
			return n*jiechen(n-1);
		}
		alert(jiechen(4)); //4*3*2*1
深拷贝实现:

//深拷贝
		var obj={
			a:{b:10}
		}
		function deep_copy (obj) {
			//利用递归的方式
			var newOBJ={};
			if(typeof obj!='object'){
				console.trace();
				return obj;//终止条件,如果不是对象就放回该值
			}
			for (var arrt in obj) {
				newOBJ[arrt]=deep_copy(obj[arrt]);//再一次拷贝(递归)
			};
			return newOBJ;
		}

		var obj2=deep_copy(obj);
		obj2.a.b=20;
		alert(obj.a.b);//10