In questo post, troverete 3 modi semplici per eseguire un clone superficiale (o copia) di oggetti in JavaScript.
Come bonus, mostrerò come potete anche aggiornare, aggiungere o rimuovere proprietà sul posto nel clone. Questo è utile quando si vuole eseguire un aggiornamento sull’oggetto in modo immutabile.
Nota
I 3 modi per clonare oggetti descritti in questo post eseguono una copia superficiale.
Una copia superficiale significa che solo l’oggetto effettivo viene copiato. Se l’oggetto copiato contiene oggetti annidati – questi oggetti annidati non vengono clonati.
Tabella dei contenuti
- 1. Clonazione usando l’oggetto spread
- 2. Clonazione usando l’oggetto rest
- 3. Clonazione usando Object.assign()
- 4. Sommario
1. Clonare usando object spread
Il modo più semplice per clonare un semplice oggetto JavaScript è invocare l’operatore object spread:
const clone = { ...object};
dove object
è l’oggetto che volete copiare, e clone
è la copia superficiale di object
.
Per esempio, creiamo una copia superficiale dell’oggetto hero
:
const hero = { name: 'Batman', city: 'Gotham'};const heroClone = { ...hero};heroClone; // { name: 'Batman', city: 'Gotham' }hero === heroClone; // => false
heroClone
è un oggetto clone di hero
, cioè contiene tutte le proprietà di hero
.
hero === heroClone
evaluta in false
hero
e heroClone
sono, tuttavia, istanze di oggetti differenti.
1.1 Bonus di diffusione dell’oggetto: aggiungere o aggiornare gli oggetti di scena clonati
Un vantaggio immediato dell’uso della diffusione dell’oggetto è che è possibile aggiornare o aggiungere nuove proprietà all’oggetto clonato sul posto, se ne avete bisogno.
Cloniamo l’oggetto hero
, ma aggiorniamo la proprietà name
ad un valore diverso e aggiungiamo una nuova proprietà realName
:
const hero = { name: 'Batman', city: 'Gotham'};const heroEnhancedClone = { ...hero, name: 'Batman Clone', realName: 'Bruce Wayne'};heroEnhancedClone; // { name: 'Batman Clone', city: 'Gotham', realName: 'Bruce Wayne' }
2. Clonare usando l’object rest
Un altro buon modo per clonare gli oggetti in modo superficiale è usando l’operatore object rest:
const { ...clone } = object;
Ancora una volta, usiamo l’operatore rest per fare una copia dell’oggetto hero
:
const hero = { name: 'Batman', city: 'Gotham'};const { ...heroClone } = hero;heroClone; // { name: 'Batman', city: 'Gotham' }hero === heroClone; // => false
Dopo aver applicato l’operatore rest const { ...heroClone } = hero
, la variabile heroClone
contiene una copia dell’oggetto hero
.
2.1 Bonus di Object Rest: saltare gli oggetti di scena clonati
Un bel bonus quando si usa Object Rest è la possibilità di saltare certe proprietà quando si clona.
Per esempio, creiamo un clone dell’oggetto hero
, ma saltiamo la proprietà city
nel clone:
const hero = { name: 'Batman', city: 'Gotham'};const { city, ...heroClone } = hero;heroClone; // { name: 'Batman' }
2.2 Super bonus: combinare object spread e rest
Object spread porta il bonus di aggiornare o aggiungere nuove proprietà, mentre object rest ha il vantaggio di saltare le proprietà nel clone risultante.
Si possono combinare object spread e rest in un’unica dichiarazione per ereditare tutti questi benefici? Sì, è possibile!
Cloniamo l’oggetto hero
, aggiungendo anche una nuova proprietà realName
e saltando la proprietà city
:
const hero = { name: 'Batman', city: 'Gotham'};const { city, ...heroClone } = { ...hero, realName: 'Bruce Wayne'};heroClone; // { name: 'Batman', realName: 'Bruce Wayne' }
Combinare la diffusione degli oggetti e il resto per clonare gli oggetti ed eseguire la manipolazione delle proprietà in un’unica dichiarazione è fantastico!
3. Clonare usando Object.assign()
Infine, Object.assign(target, ...sources)
permette di eseguire la stessa clonazione di oggetti:
const clone = Object.assign({}, object);
Utilizziamo Object.assign()
in pratica e creiamo un oggetto clone di hero
oggetto:
const hero = { name: 'Batman', city: 'Gotham'};const heroClone = Object.assign({}, hero);heroClone; // { name: 'Batman', city: 'Gotham' }hero === heroClone; // => false
Object.assign({}, hero)
crea un clone di hero
fondendo il secondo argomento hero
nel primo argomento {}
.
3.1 Bonus Object.assign(): aggiungere o aggiornare gli oggetti di scena clonati
Object.assign()
permette anche di aggiornare o aggiungere nuove proprietà al clone.
Copiamo l’oggetto hero
, ma allo stesso tempo aggiorniamo la proprietà name
:
const hero = { name: 'Batman', city: 'Gotham'};const heroClone = Object.assign({}, hero, { name: 'Batman Clone' });heroClone; // { name: 'Batman Clone', city: 'Gotham' }
Object.assign({}, hero, { name: 'Batman Clone' })
crea l’oggetto in 2 passi.
Prima, il secondo argomento hero
è fuso nel primo argomento {}
. Questo equivale a { name: 'Batman', city: 'Gotham' }
.
In secondo luogo, il terzo argomento { name: 'Batman Clone' }
viene fuso nel risultato del passo precedente, sovrascrivendo la proprietà name
. Infine, si ottiene l’oggetto { name: 'Batman Clone', city: 'Gotham' }
.
4. Riassunto
JavaScript fornisce 3 buoni modi per clonare oggetti: usando l’operatore spread, l’operatore rest e la funzione Object.assign()
.
Oltre a clonare semplicemente gli oggetti, l’utilizzo dell’operatore spread e Object.assign()
permette di aggiungere o aggiornare le proprietà durante la creazione del clone.
L’operatore Rest dà anche il vantaggio di saltare alcune proprietà durante la clonazione.
E la cosa grandiosa è che si possono combinare la diffusione dell’oggetto e il rest in una singola dichiarazione, in modo da poter clonare l’oggetto, e allo stesso tempo aggiungere, aggiornare o saltare le proprietà dall’essere clonato.
Questo è utile se volete abbracciare l’immutabilità ed essere in grado di manipolare le proprietà dell’oggetto clonato sul posto.
Quali altri buoni modi per clonare oggetti in JavaScript conoscete?