2014-10-16 6 views
42

Sto lavorando a un progetto che ha sia Angular che Underscore come dipendenza.Devo usare Angular.copy() o _.clone()?

Quando ho bisogno di creare una copia di un oggetto, a seconda del mio stato d'animo in quel momento, avrei potuto usare angular.copy() o _.clone()

Mi viene in mente che uno di questi metodi è probabilmente più veloce/affidabile/robusto rispetto agli altri.

Esistono problemi noti con una di queste funzioni che rendono l'utilizzo migliore o peggiore rispetto all'altra, presupponendo che entrambe le librerie siano già incluse?

+1

avete risultati di confronti che avete già correva, possibilmente con jsperf? o non hai ancora fatto ricerche. –

+4

i due metodi eseguono chiaramente due compiti diversi, in base alla documentazione, (copia profonda vs copia superficiale), quindi il modo migliore di utilizzare dipende da cosa esattamente si voleva fare in ciascun caso. –

+1

Quindi, lodash ha un metodo cloneDeep e anche se si passa un metodo booleano al metodo clone di lodash si crea un clone profondo secondo la documentazione.Qualche suggerimento sulle prestazioni di questi metodi rispetto a angular.copy? –

risposta

39

Per quanto riguarda la tua domanda: angular.copy e _.clone sono diversi. Non è una questione su quale sia meglio, riguarda ciò di cui hai bisogno come @Kevin B ha dichiarato nei commenti.

angular.extend() d'altra parte, è una copia simile a _.clone

Angular.copy vs Angular.extend

Prestazioni saggio, io non sono sicuro che è meglio, ma per l'amor opinioni, i Sono contrario a includere le librerie nello scope globale (underscore) con qualsiasi app angolare, poiché di solito queste cose sono scritte come angular modules. angular.copy/angular.extend vincerebbe in questo caso.

Shallow/copia completa:

La sua molto semplice che, se l'oggetto ha solo campi primitivi, poi, ovviamente, si andrà per copia superficiale, ma se l'oggetto ha riferimenti ad altri oggetti, poi sulla base di il requiement, la copia superficiale o la copia profonda dovrebbero essere scelti. Quello che intendo qui è che se i riferimenti non vengono modificati in qualsiasi momento, non ha senso andare in deep copy. Puoi semplicemente optare per una copia superficiale. Ma se i riferimenti vengono modificati spesso, è necessario andare in deep copy. Ancora una volta non c'è una regola dura e veloce, tutto dipende dal requisito.

Source

+1

"Ma se i riferimenti vengono modificati spesso, è necessario andare in deep copy." Direi invece che se i riferimenti sono modificati allora probabilmente importa se fai profondi o bassi, ma se non lo sono allora probabilmente non importa. In effetti, direi che nei casi in cui i riferimenti vengono modificati, è più probabile che si desideri utilizzare una copia superficiale. Ma come ha detto livepo, è necessario decidere caso per caso. Per quanto riguarda le prestazioni, come regola generale, il clone superficiale dovrebbe essere più veloce del clone profondo, soprattutto per le strutture di dati profonde. Per strutture poco profonde, potrebbe dipendere dalla libreria. –

+1

Di solito includo il carattere di sottolineatura come servizio in app che devono eseguire estese trasformazioni di dati. Questo ti impedisce di usare il '_' globale. Questo approccio funziona bene anche per altre librerie utili e autonome, ad es. momentjs. –

+2

Scommetto che la tua risposta sarebbe diversa ora nel 2016. Puoi facilmente usare l'iniezione di dipendenza (non quella angolare) usando common o require e avere accesso a underscore o lodash. È stato trovato che Lodash è più veloce dei metodi nativi del browser in alcuni casi, come ad esempio _forapida in Chrome. Può essere molto importante in un'applicazione di dati su larga scala. – bwinchester

3

Abbiamo avuto alcune segnalazioni di bug che confermano che l'uso angular.copy non creare oggetti vuoti su alcuni telefoni cellulari Windows. Quindi, se è necessario supportare qualsiasi versione di IE su dispositivo mobile, non utilizzare angular.copy! Presumibilmente questo bug è stato risolto da Microsoft, ma comunque abbiamo avuto a che fare con esso ...

In realtà, si può anche usare Object.assign() ...

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

Altri esempi: https://googlechrome.github.io/samples/object-assign-es6/

so che dice di no IE, ma ho provato sulla mia IE11 e funziona ...