首页 > 代码库 > 深度克隆---js对象引用

深度克隆---js对象引用

首先,我们要知道,javascript中除了基本类型(number,string,boolean,null,undefined)之外就是引用类型了,也可以说就是js对象了。

引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。

在探讨到深度克隆之前,我们先来看一下下面的例子:

example01:

1     var a = [1,2,3];
2     var b = a; // a b共用一个引用
3     b.push(4);
4     alert(b); // [1,2,3,4]
5     alert(a); // [1,2,3,4]

 

example02:

1     var a = [1,2,3];
2     var b = a;
3     b = [1,2,3,4]; // b新开了一个引用
4     alert(b); // [1,2,3,4]
5     alert(a); // [1,2,3]

 

example03:

1     var obj = {
2         a: 10
3     };
4     var obj2 = obj;
5     obj2.a = 20;
6     alert(obj.a); // 20

 

example04:

 1     var obj = {
 2         a: 10
 3     };
 4     function copy(obj){ // 浅拷贝, 只拷贝的一层
 5         var newObj = {};
 6         for(var attr in obj){
 7             newObj[attr] = obj[attr];
 8         }
 9         return newObj;
10     }
11     var obj2 = copy(obj);
12     obj2.a = 20;
13     alert(obj.a); // 10

 

example05:

 1     var obj = {
 2         a: {
 3             b: 10
 4         }
 5     }
 6     function copy(obj){  //浅拷贝, 只拷贝了一层
 7         var newObj = {};
 8         for(var attr in obj){
 9             newObj[attr] = obj[attr];
10         }
11         return newObj;
12     }
13     var obj2 = copy(obj);
14     obj2.a.b = 20;
15     alert(obj.a.b); // 20

看完上面几个例子之后,想必对js对象引用有了一定的认识。接下来,我们来看js里面另外一个重要的应用---递归。

递归定义可以分为两点:(1).函数调用函数自身,执行递的动作;(2).最后一次判断一个终止条件,可以执行归的动作。

example06:

1     //求nX(n-1)X(n-2)X...X2X1
2    
3      function test(n){
4          if(n == 1){
5             return 1;
6          }
7         return n*test(n-1);
8      }
9      alert(test(5)); // 120

 

所以,深拷贝也用到了递归。

对象的子对象也是引用,所以遍历赋值的时候要判断,子元素是否是对象,如果子元素是对象,则继续对子元素进行遍历赋值

example07:

 1     //深拷贝
 2     function deepClone(obj){
 3         var newObj = {};
 4         if(typeof obj != ‘object‘){
 5             return obj;
 6         }
 7         for(var attr in obj){
 8             newObj[attr] = deepClone(obj[attr]);
 9         }
10         return newObj;
11     }
12     var obj = {
13         a: {
14             b: 10
15         }
16     };
17     var obj2 = deepClone(obj);
18     obj2.a.b = 20;
19     alert(obj.a.b); // 10

 

深度克隆---js对象引用