1. 程式人生 > >javascript---物件和函式的引用、淺拷貝、深拷貝、遞迴

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