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深拷贝实现:
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