web-dev-qa-db-fra.com

Devrais-je utiliser Angular.copy () ou _.clone ()?

Je travaille sur un projet qui a à la fois Angular et Underscore comme dépendance.

Lorsque j'ai besoin de créer une copie d'un objet, en fonction de mon humeur du moment, je pourrais utiliser angular.copy() ou _.clone()

Il me semble que l’une de ces méthodes est probablement plus rapide/fiable/robuste que l’autre.

Existe-t-il un problème connu avec l'une ou l'autre de ces fonctions qui rend son utilisation meilleure ou pire que l'autre, en supposant que les deux bibliothèques sont déjà incluses?

47
Code Whisperer

Concernant votre question: angular.copy et _.clone sont différents. Ce n’est pas une question de savoir ce qui est préférable, c’est ce dont vous avez besoin, comme l’a déclaré @Kevin B dans les commentaires.

angular.extend () en revanche, est une copie superficielle semblable à _.clone

Angular.copy vs Angular.extend

En ce qui concerne les performances, je ne suis pas sûr de ce qui est préférable, mais pour des raisons d’opinion, je suis opposé à l’inclusion des bibliothèques dans le champ d’application global (soulignement) avec tout angular app, comme cela est habituellement le cas). écrit sous la forme modules angulaires . angular.copy/angular.extend gagnerait dans ce cas.

Copie peu profonde/profonde:

C’est très simple: si l’objet ne comporte que des champs primitifs, il est évident que vous opterez pour une copie superficielle, mais si l’objet contient des références à d’autres objets, vous devez choisir une copie superficielle ou profonde en fonction du requiement. Ce que je veux dire, c’est que, si les références ne sont pas modifiées à tout moment, il n’ya alors aucune raison de choisir une copie en profondeur. Vous pouvez simplement choisir une copie superficielle. Mais si les références sont modifiées souvent, vous devez opter pour une copie en profondeur. Là encore, il n’ya pas de règle absolue, tout dépend de la nécessité.

Source

42
dannypaz

Certains rapports de bogues confirment que l'utilisation de angular.copy crée des objets vides sur certains téléphones mobiles Windows. Donc, si vous avez besoin de supporter n'importe quelle version de IE sur mobile, n'utilisez pas angular.copy! Ce problème a été corrigé par Microsoft, mais nous avons néanmoins dû le gérer ...

En fait, vous pouvez aussi utiliser Object.assign()...

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

Autres exemples: https://googlechrome.github.io/samples/object-assign-es6/

Je sais que cela ne dit pas IE, mais je l'ai essayé sur mon IE11 et ça marche ...

4
Guntram