• 深度克隆---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
  • 相关阅读:
    Codeforces 295 (Div.1)
    Codeforces 614
    Java面试题
    Eclipse创建JSP、HTML、CSS文件默认字符集设置成UTF-8
    Eclipse中配置Tomcat容器
    设置Eclipse中的字符集为UTF-8
    Windows中配置maven环境变量
    Windows中配置MySQL环境变量
    Nacicat for Oracle 绿色版 亲测可用
    MySQL安装版安装过程
  • 原文地址:https://www.cnblogs.com/xiayu25/p/6265664.html
Copyright © 2020-2023  润新知