La destrutturazione degli oggetti è un’utile funzione JavaScript per estrarre proprietà dagli oggetti e legarli alle variabili.
Cosa c’è di meglio, la destrutturazione degli oggetti può estrarre più proprietà in un’istruzione, può accedere alle proprietà dagli oggetti nidificati e può impostare un valore predefinito se la proprietà non esiste.
In questo post, spiegherò come utilizzare la destrutturazione degli oggetti in JavaScript.
- 1. La necessità di destrutturazione dell’oggetto
- 2. Estrazione di una proprietà
- 3. Estrazione di più proprietà
- 4. Valori predefiniti
- 5. Alias
- 6. Estrazione di proprietà da oggetti nidificati
- 7. Estrazione di una proprietà nome dinamico
- 8. Oggetto Rest dopo la destrutturazione
- 9. Casi d’uso comuni
- 9.1 Proprietà Bind alle variabili
- 9.2 Parametro di funzione destrutturazione
- 10. Sommario
1. La necessità di destrutturazione dell’oggetto
Immagina di voler estrarre alcune proprietà di un oggetto. In un ambiente pre-ES2015, è necessario scrivere il seguente codice:
var hero = { name: 'Batman', realName: 'Bruce Wayne'};var name = hero.name;var realName = hero.realName;name; // => 'Batman',realName; // => 'Bruce Wayne'
Il valore della proprietà hero.name
viene assegnato alla variabile name
. Allo stesso modo il valore hero.realName
viene assegnato a realName
.
Un modo per accedere alle proprietà e assegnarle alle variabili richiede codice boilerplate. Scrivendo var name = hero.name
, devi menzionare il name
vincolante 2 volte, e lo stesso per realName
.
Ecco dove è utile la sintassi di destrutturazione dell’oggetto: puoi leggere una proprietà e assegnare il suo valore a una variabile senza duplicare il nome della proprietà. Inoltre, puoi leggere più proprietà dallo stesso oggetto in una sola istruzione!
Rifattorizziamo lo script precedente e applichiamo la destrutturazione dell’oggetto per accedere alle proprietà name
e realName
:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, realName } = hero;name; // => 'Batman',realName; // => 'Bruce Wayne'
const { name, realName } = hero
è un oggetto destrutturazione assegnazione. Questa istruzione definisce le variabili name
e realName
, quindi assegna loro i valori delle proprietà hero.name
e hero.realName
corrispondentemente.
Confronto tra i 2 approcci per accedere alle proprietà dell’oggetto:
const name = hero.name;const realName = hero.realName;// is equivalent to:const { name, realName } = hero;
è visibile che la destrutturazione dell’oggetto è più maneggevole perché né i nomi delle proprietà né la variabile oggetto sono duplicati.
2. Estrazione di una proprietà
La sintassi di base della destrutturazione degli oggetti è piuttosto semplice:
const { identifier } = expression;
Dove identifier
è il nome della proprietà a cui accedere e expression
dovrebbe valutare un oggetto. Dopo la destrutturazione, la variabile identifier
contiene il valore della proprietà.
Ecco il codice equivalente utilizzando una proprietà della funzione di accesso:
const identifier = expression.identifier;
proviamo oggetto destrutturazione in pratica:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name } = hero;name; // => 'Batman'
L’istruzione const { name } = hero
definisce la variabile name
e la inizializza con il valore di hero.name
proprietà.
3. Estrazione di più proprietà
Per destrutturare l’oggetto in più proprietà, enumerare tutte le proprietà che si desidera aggiungendo virgole ,
in-between:
const { identifier1, identifier2, ..., identifierN } = expression;
Dove identifier1
, …, identifierN
sono nomi di proprietà a cui accedere e expression
dovrebbe valutare un oggetto. Dopo la destrutturazione, le variabili identifier1
, …, identifierN
contengono i valori delle proprietà corrispondenti.
Ecco il codice equivalente:
const identifier1 = expression.identifier1;const identifier2 = expression.identifier2;// ...const identifierN = expression.identifierN;
Diamo un’occhiata di nuovo all’esempio dalla prima sezione, dove vengono estratte 2 proprietà:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, realName } = hero;name; // => 'Batman',realName; // => 'Bruce Wayne'
const { name, realName } = hero
crea 2 variabili name
e realName
assegnate con i valori delle proprietà corrispondenti hero.name
e hero.realName
.
4. Valori predefiniti
Se l’oggetto destrutturato non ha la proprietà specificata nell’assegnazione destrutturazione, alla variabile viene assegnato undefined
. Vediamo come succede:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { enemies } = hero;enemies; // => undefined
Dopo la destrutturazione la variabile enemies
è undefined
perché la proprietà enemies
non esiste nell’oggetto hero
.
Fortunatamente, è possibile impostare un valore predefinito se la proprietà non esiste nell’oggetto destrutturato. Ecco la sintassi di base:
const { identifier = defaultValue } = expression;
Dove identifier
è il nome della proprietà a cui accedere e expression
dovrebbe valutare un oggetto. Dopo la destrutturazione, la variabile identifier
contiene il valore della proprietà o viene assegnata con defaultValue
se la proprietà identifier
non esiste.
Ecco il codice equivalente:
const identifier = expression.identifier === undefined ? defaultValue : expression.identifier;
Cambiamo l’esempio di codice precedente e usiamo la funzione valore predefinito:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { enemies = } = hero;enemies; // =>
Ora, invece di essere undefined
, la variabile enemies
è impostata su .
5. Alias
Se si desidera creare variabili con nomi diversi rispetto alle proprietà, è possibile utilizzare la funzione di aliasing di destrutturazione degli oggetti.
const { identifier: aliasIdentifier } = expression;
identifier
è il nome della proprietà a cui accedere, aliasIdentifier
è il nome della variabile e expression
dovrebbe valutare un oggetto. Dopo la destrutturazione, la variabile aliasIdentifier
contiene il valore della proprietà.
Il codice equivalente:
const aliasIdentifier = expression.identifier;
Ecco un esempio di oggetto destrutturazione funzione di alias:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { realName: secretName } = hero;secretName; // => 'Bruce Wayne'
Guardando const { realName: secretName } = hero
, il destucturing definisce una nuova variabile secretName
(alias variabile), e le assegna il valore hero.realName
.
6. Estrazione di proprietà da oggetti nidificati
Negli esempi precedenti, gli oggetti erano semplici: le proprietà hanno tipi di dati primitivi (ad esempio stringhe).
Spesso gli oggetti possono essere nidificati in altri oggetti. In altre parole, alcune proprietà possono contenere oggetti.
In tal caso, è comunque possibile utilizzare la destrutturazione dell’oggetto e accedere alle proprietà da deep. Ecco la sintassi di base:
const { nestedObjectProp: { identifier } } = expression;
nestedObjectProp
è il nome della proprietà che contiene un oggetto nidificato. identifier
è il nome della proprietà a cui accedere dall’oggetto nidificato. expression
dovrebbe valutare l’oggetto destrutturato.
Dopo la destrutturazione, la variabile identifier
contiene il valore della proprietà dell’oggetto nidificato.
La sintassi di cui sopra è equivalente a:
const identifier = expression.nestedObjectProp.identifier;
Il livello di nidificazione da cui è possibile estrarre le proprietà è illimitato. Se si desidera estrarre le proprietà da deep, è sufficiente aggiungere più parentesi graffe nidificate:
const { propA: { propB: { propC: { .... } } } } = object;
Ad esempio, l’oggetto hero
contiene un oggetto nidificato { city: 'Gotham'}
.
const hero = { name: 'Batman', realName: 'Bruce Wayne', address: { city: 'Gotham' }};// Object destructuring:const { address: { city } } = hero;city; // => 'Gotham'
L’oggetto destrutturazione const { address: { city } } = hero
consente di accedere alla proprietà city
dall’oggetto nidificato.
7. Estrazione di una proprietà nome dinamico
È possibile estrarre in variabili proprietà con un nome dinamico (il nome della proprietà è noto in fase di runtime):
const { : identifier } = expression;
propName
expression dovrebbe valutare un nome di proprietà (di solito una stringa) e identifier
dovrebbe indicare il nome della variabile creato dopo la destrutturazione. Il secondo expression
dovrebbe valutare l’oggetto che desideri distruggere.
Un codice equivalente senza oggetto destrutturazione:
const identifier = expression;
vediamo un esempio in cui prop
> contiene il nome della proprietà:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const prop = 'name';const { : name } = hero;name; // => 'Batman'
const { : name } = hero
è un oggetto destrutturazione che assegna alla variabile name
valore hero
, dove prop
è una variabile che tiene il nome della proprietà.
8. Oggetto Rest dopo la destrutturazione
La sintassi rest è utile per raccogliere le proprietà rimanenti dopo la destrutturazione:
const { identifier, ...rest } = expression;
Dove identifier
è il nome della proprietà a cui accedere e expression
dovrebbe valutare un oggetto.
Dopo la destrutturazione, la variabile identifier
contiene il valore della proprietà. rest
variabile è un oggetto semplice con le proprietà rimanenti.
Ad esempio, estraiamo la proprietà name
, ma manteniamo il resto delle proprietà:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, ...realHero } = hero;realHero; // => { realName: 'Bruce Wayne' }
La destrutturazione const { name, ...realHero } = hero
estrae la proprietà name
.
Allo stesso tempo, le proprietà rimanenti (realName
in questo caso) vengono raccolte nella variabile realHero
: { realName: 'Bruce Wayne' }
.
9. Casi d’uso comuni
9.1 Proprietà Bind alle variabili
Come visto in molti esempi prima, l’oggetto destrutturazione lega i valori delle proprietà alle variabili.
La destrutturazione dell’oggetto può assegnare valori alle variabili dichiarate utilizzando const
, let
e var
. O anche assegnare a una variabile già esistente.
Ad esempio, ecco come destrutturare usando l’istruzione let
:
// letconst hero = { name: 'Batman',};let { name } = hero;name; // => 'Batman'
Come destructure utilizzando var
istruzione:
// varconst hero = { name: 'Batman',};var { name } = hero;name; // => 'Batman'
E come destructure a una variabile dichiarata:
// existing variablelet name;const hero = { name: 'Batman',};({ name } = hero);name; // => 'Batman'
io trovo soddisfacente per combinare for..of
ciclo con oggetto destrutturazione per estrarre il diritto di proprietà di distanza:
const heroes = ;for (const { name } of heroes) { console.log(name); // logs 'Batman', 'Joker'}
9.2 Parametro di funzione destrutturazione
in generale, l’oggetto destrutturazione può essere posizionato in qualsiasi punto in cui assegnazione avviene.
Ad esempio, è possibile distruggere un oggetto all’interno dell’elenco dei parametri di una funzione:
const heroes = ;const names = heroes.map( function({ name }) { return name; });names; // =>
function({ name })
destruttura il parametro della funzione, creando una variabile name
che contiene il valore della proprietà name
.
10. Sommario
La destrutturazione dell’oggetto è una potente funzionalità che consente di estrarre le proprietà da un oggetto e associare questi valori alle variabili.
Mi piace particolarmente la destrutturazione degli oggetti è la sintassi concisa e la capacità di estrarre più variabili in un’unica istruzione.
Speriamo che il mio post ti abbia aiutato a vedere quanto sia utile la destrutturazione degli oggetti!