javascript---物件和函式的引用、淺拷貝、深拷貝、遞迴
阿新 • • 發佈:2018-12-31
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