angular.copy和angular.merge之间的区别

时间:2017-02-15 19:22:32

标签: angularjs

我正在研究angularjs并且对使用由角度库提供的复制和合并功能有疑问。根据文档,复制创建源的深层副本,而merge通过从源对象复制自己的可枚举属性来深度扩展目标对象。

Google只提供复制与扩展或合并与扩展。我所能找到的只是深度复制的概念和递归的深度扩展。这两者有什么区别?哪个比另一个更受欢迎?

我创建了plunker并且两者都有相同的输出。

https://plnkr.co/edit/CORt259oczKwpBzh7cNH?p=preview

这是具有控制器部分的片段:

<script type="text/javascript">
    var app= angular.module("myapp",[]);
    app.controller("myctrl",[function(){
        var self = this;
        self.obj={
                val1: 'val1',
                val2: 'val2',
                val3: [{a:12, b:13}],
                val4: {c:23, d:56}
        };

        self.secobj={};
        self.thobj={};
        self.forobj={};

        self.changeVal = function(){
            angular.copy(self.obj, self.secobj);
            angular.extend(self.thobj, self.obj);
            angular.merge(self.forobj, self.obj);
            self.obj.val1 = 'value 1';
            self.obj.val2 = 'value 2';
            self.obj.val3[0].a = 11223;
            self.obj.val3[0].b = 22334;
            self.obj.val4.c = 1000;
            self.obj.val4.d = 5555;
        };


    }]);
</script>

1 个答案:

答案 0 :(得分:2)

我在github上看到了angularjs的源代码,可以更深入地了解这一点。

Angular.copy只是简单地将对象从源代码复制到目标。在该过程中,它从目标对象中删除所有对象,然后从源复制属性。

另一方面,merge将源对象附加到目标。因此,如果目标对象已经有一些元素,它将保留在那里,源对象的新属性将添加到目标对象。此外,merge支持多个源对象,它们可以将自己附加到目标对象。