深拷贝/浅拷贝之Js / AngularJs

var a = [1,2,3,4];
var b = a;
b[1] = 8;
console.log("a:" + a );//1,8,3,4
consloe.log("b:" + b);//1,8,3,4

上面的这种直接赋值的方式其实就是浅拷贝,但是上面打印的并我们想要得到的结果,其实我们想要的是a的值不变。所以这就需要用其他方式来解决

关于JS 的深拷贝:

数组深拷贝:

(1),slice

var a = [1,2,3,4];
var b = a.slice(0);
b[1] = 8;
console.log("a:" + a );//1,2,3,4
consloe.log("b:" + b);//1,8,3,4

 

(2),concat

var a = [1,2,3,4];
var b = a.concat();//连接一个空的
b[1] = 8;
console.log("a:" + a );//1,2,3,4
consloe.log("b:" + b);//1,8,3,4

 

对象深拷贝:

对象的深拷贝,就只能遍历整个对象,赋值给新的对象

var deep_copy= function(obj) { //对象深拷贝
var new_obj={};
for (var key in obj) {
      new_obj[key] = typeof obj[key]===’object’? deep_copy(obj[key]): obj[key];//递归赋值
   } 
   return new_obj; 
}

关于AngularJs 的浅拷贝:

<div ng-app>
    <div ng-controller="demoCtrl">
        {{sample}}
    </div>
</div>
function demoCtrl($scope){
        var DeepCopy = function(data) {
          angular.forEach(arguments, function(obj) {//遍历arguments-->即data
            if (obj !== data) {
              angular.forEach(obj, function(value, key) {
                if(angular.isObject(data[key]) || angular.isArray(data[key])){
                  DeepCopy(data[key], value);
                } else {
                  data[key] = angular.copy(value);
                }     
              });   
            }
          });
          return data;
        };
    
    $scope.a = {
        "one":11,"two":[
            {
                "name":"小明",
                "age":13,
                "items":[
                    {
                        "a":1,
                        "b":1,
                        "c":2
                    }
                ]
            },
            {
                "age":24,
                "items":[
                    {
                        "a":10,
                        "c":10
                    }
                ]
            }
        ]
    };
    var b = {
        "one":33,        "two":[
            {
                "age":63,
                "items":[
                    {
                        "a":88,
                        "b":88
                    }
                ]},
            {
                "age":14,
                 "items":[
                     {
                         "a":70,
                         "b":70
                     }
                 ]
                }
        ]
    };
    DeepCopy($scope.a,b);
}

结果:

{"one":33,"two":[{"name":"小明","age":63,"items":[{"a":88,"b":88,"c":2}]},{"age":14,"items":[{"a":70,"c":10,"b":70}]}]}

 

这样的对象深拷贝才满足要求,完美复制!

 

posted @ 2017-04-07 16:50  doctype  阅读(1096)  评论(0编辑  收藏  举报