//遞迴就是函數自己呼叫自己
//遞迴的重要因子,遞迴的結束條件
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