複習遞迴和拷貝案例

2020-09-28 11:01:18
//遞迴就是函數自己呼叫自己
			//遞迴的重要因子,遞迴的結束條件
			function say(n){
				if(n==0){return}//當n = 0 的時候遞迴結束
				alert("你好")
				n--;//讓n--
				say(n);
			}
			say(5);
//不用for迴圈求出1-3的和
			function sum(n){
				if(n==1){return 1};
				return n + sum(n-1);
			}
			alert(sum(3));
			//第一次 return 3+sum(2)
			//第二次 return 2+sum(1)
			//第三次 return 1
			//				3+2+1
//求一個斐波那契數列
			//1,1,2,3,5,8,13,21...
			//前面兩個數是第三個數的和
			function getFib(n){
				if(n==1||n==2){return 1}
				else{
					return getFib(n-1)+getFib(n-2)
				}
			}
			
			getFib(30);
// 深拷貝
			var obj = {
				name:"mumu",
				age:18,
				arr:[2,4,6,8],
				job:{slary:150,time:8,workers:["zql","曾慶林"]},
				say(){alert(this.name)}
			}
			// 淺拷貝
			// var obj2  = Object.assign({},obj)
			//               淺拷貝物件(源,目標,目標2,。..)
			function deepCopy(obj){
				// 判斷物件型別,如果是陣列,如果是物件,要進行遞迴
				var type = typeof obj; 
				if(type=="object"){//參照型別物件
					var result ;					
					if(Array.isArray(obj)){ //如果是一個陣列
						result= [];//宣告result是一個陣列
						for(var i=0;i<obj.length;i++){ //for迴圈遍歷陣列
							result[i] = deepCopy(obj[i]); //遞迴拷貝
						}
						
					}else{
						result = {};
						for( var k in obj){ //for in 遍歷 
							result[k] = deepCopy(obj[k]) //遞迴拷貝
						}
					}
					return result;
				}else{// 值型別物件 直接返回					
					return obj; 
				}
			}
			var obj2 = deepCopy(obj);
			var obj5 = JSON.parse(JSON.stringify(obj))
			// json字元物件型別  Number  Boolean  String Array  Object  null