2014-10-16 97 views
42

我正在研究一个既有Angular也有Underscore作为依赖的项目。我应该使用Angular.copy()还是_.clone()?

当我需要创建一个对象的副本,这取决于我的心情的时候,我可能会使用angular.copy()_.clone()

它发生,我认为这些方法之一可能是更快速/可靠/健壮比其他。

是否有任何已知的问题,使这些函数使用比其他函数更好或更差,假设这两个库已包含在内?

+1

你有从你已经跑了,可能与jsperf比较的结果?或者你没有做过研究。 – 2014-10-16 18:53:57

+4

根据文档,这两种方法清楚地执行两个不同的任务(深拷贝vs浅拷贝),因此最好使用将取决于你在每种情况下想要做什么。 – 2014-10-16 18:55:43

+1

因此,lodash具有cloneDeep方法,并且如果您将布尔值传递给lodash的克隆方法,则会根据文档创建一个深度克隆。任何关于这些方法与angular.copy性能的建议? – 2015-07-23 19:44:51

回答

39

关于你的问题: angular.copy和_.clone是不同的。这不是一个更好的问题,而是关于你在凯文B在评论中所说的需要。

angular.extend(),另一方面,是一种浅拷贝类似于_.clone

Angular.copy vs Angular.extend

明智的性能,我不知道这是更好的,但是对于意见的缘故,我反对将任何角度应用程序包括到全局范围(下划线)中,因为通常这些东西写为angular modules。在这种情况下angular.copy/angular.extend会胜出。

浅/深复制

它非常简单,如果对象只有原始的领域,那么显然你会去浅拷贝,但如果对象具有其他对象的引用,然后根据应选择要求,浅拷贝或深拷贝。我的意思是,如果引用不随时修改,那么进行深层复制就没有意义了。你可以选择浅拷贝。但如果参考文件经常被修改,那么您需要进行深度复制。再次没有硬性规定,这一切都取决于要求。

Source

+1

“但是,如果参考文件经常被修改,那么您需要进行深度复制。”相反,如果引用被修改,那么无论你做的是深还是浅,可能都很重要,但如果它们不是,那么它可能并不重要。事实上,我会说,在引用被修改的情况下,你通常想要使用浅拷贝。但正如livepo所说,你需要根据具体情况来决定。至于性能,作为一般规则,浅克隆应该比深克隆快,特别是深数据结构。对于浅层结构,它可能取决于图书馆。 – 2014-10-16 20:08:17

+1

我通常在需要进行大量数据转换的应用程序中包含下划线作为服务。这可以防止你不得不使用全局'_'。这种方法也适用于其他有用的自包含的库,例如, momentjs。 – 2015-04-24 07:31:05

+2

我敢打赌你的答案现在就不同了2016年,您可以非常容易地使用依赖注入(没有棱角的)使用通用或要求,并有机会获得下划线或lodash。在某些情况下,Lodash被发现比本地浏览器方法更快,例如Chrome中的_.forEach。在大规模数据应用中可能非常重要。 – bwinchester 2016-10-21 13:53:11

3

我们有一些bug报告,确认使用angular.copy确实在某些Windows手机创建空的对象。 因此,如果您需要支持移动版本的任何版本的IE,请不要使用angular.copy! 据称这个bug已经修复微软,但尽管如此,我们不得不面对它......

其实,你可以如用Object.assign() ...

文档:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

进一步的例子: https://googlechrome.github.io/samples/object-assign-es6/

我知道它说没有IE浏览器,但我想它在我的IE11和它的作品...