objektdestrukturering er en nyttig JavaScript-funktion til at udtrække egenskaber fra objekter og binde dem til variabler.
hvad er bedre, objektdestrukturering kan udtrække flere egenskaber i en sætning, kan få adgang til Egenskaber fra indlejrede objekter og kan indstille en standardværdi, hvis egenskaben ikke findes.
i dette indlæg forklarer jeg, hvordan man bruger objektdestrukturering i JavaScript.
- 1. Behovet for objektdestrukturering
- 2. Udtrækning af en egenskab
- 3. Udpakning af flere egenskaber
- 4. Standardværdier
- 5. Aliaser
- 6. Udtrækning af egenskaber fra indlejrede objekter
- 7. Udpakning af en dynamisk navneegenskab
- 8. Rest objekt efter destrukturering
- 9. Almindelige brugssager
- 9.1 Bind egenskaber til variabler
- 9.2 Funktionsparameter destrukturering
- 10. Resume
1. Behovet for objektdestrukturering
Forestil dig, at du gerne vil udtrække nogle egenskaber ved et objekt. I et pre-ES2015-miljø skal du skrive følgende kode:
var hero = { name: 'Batman', realName: 'Bruce Wayne'};var name = hero.name;var realName = hero.realName;name; // => 'Batman',realName; // => 'Bruce Wayne'
egenskaben hero.name
værdi er tildelt til variablen name
. Samme måde hero.realName
værdi er tildelt realName
.
sådan en måde at få adgang til Egenskaber og tildele dem til variabler kræver standardtekst kode. Ved at skrive var name = hero.name
skal du nævne name
bindingen 2 gange, og det samme for realName
.
det er her syntaksen for objektdestrukturering er nyttig: du kan læse en egenskab og tildele dens værdi til en variabel uden at duplikere egenskabsnavnet. Mere end det kan du læse flere egenskaber fra det samme objekt i kun en erklæring!
lad os refactor ovenstående script og anvende objektdestruktureringen for at få adgang til egenskaberne name
og realName
:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, realName } = hero;name; // => 'Batman',realName; // => 'Bruce Wayne'
const { name, realName } = hero
er en objekt destrukturering opgave. Denne erklæring definerer variablerne name
og realName
og tildeler dem derefter værdierne for egenskaber hero.name
og hero.realName
tilsvarende.
sammenligning af de 2 tilgange for at få adgang til objektegenskaberne:
const name = hero.name;const realName = hero.realName;// is equivalent to:const { name, realName } = hero;
det er synligt, at objektdestruktureringen er mere praktisk, fordi hverken egenskabsnavnene eller objektvariablen duplikeres.
2. Udtrækning af en egenskab
den grundlæggende syntaks for objektdestrukturering er ret enkel:
const { identifier } = expression;
hvor identifier
er navnet på ejendommen, der skal åbnes, og expression
skal evalueres til et objekt. Efter destruktureringen indeholder variablen identifier
egenskabsværdien.
her er den tilsvarende kode ved hjælp af en ejendomsadgang:
const identifier = expression.identifier;
lad os prøve objektets ødelæggelse i praksis:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name } = hero;name; // => 'Batman'
erklæringen const { name } = hero
definerer variablen name
og initialiserer den med værdien af hero.name
ejendom.
3. Udpakning af flere egenskaber
for at ødelægge objektet i flere egenskaber skal du opregne så mange egenskaber, som du vil tilføje kommaer ,
imellem:
const { identifier1, identifier2, ..., identifierN } = expression;
hvor identifier1
,…, identifierN
er navne på egenskaber, der skal åbnes, og expression
skal evalueres til et objekt. Efter destruktureringen indeholder variablerne identifier1
,…, identifierN
tilsvarende egenskabsværdier.
her er den tilsvarende kode:
const identifier1 = expression.identifier1;const identifier2 = expression.identifier2;// ...const identifierN = expression.identifierN;
lad os se igen på eksemplet fra det første afsnit, hvor 2 egenskaber udvindes:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, realName } = hero;name; // => 'Batman',realName; // => 'Bruce Wayne'
const { name, realName } = hero
opretter 2 variabler name
og realName
tildelt med værdier af tilsvarende egenskaber hero.name
og hero.realName
.
4. Standardværdier
hvis det destrukturerede objekt ikke har den egenskab, der er angivet i destruktureringstildelingen, tildeles variablen undefined
. Lad os se, hvordan det sker:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { enemies } = hero;enemies; // => undefined
efter destrukturering er variablen enemies
undefined
, fordi egenskaben enemies
ikke findes i objektet hero
.
heldigvis kan du indstille en standardværdi, hvis ejendommen ikke findes i det destruerede objekt. Her er den grundlæggende syntaks:
const { identifier = defaultValue } = expression;
hvor identifier
er navnet på ejendommen, der skal åbnes, og expression
skal evalueres til et objekt. Efter destruktureringen indeholder variablen identifier
egenskabsværdien eller tildeles defaultValue
hvis identifier
egenskab ikke findes.
her er den tilsvarende kode:
const identifier = expression.identifier === undefined ? defaultValue : expression.identifier;
lad os ændre den forrige kodeeksempel og bruge standardværdifunktionen:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { enemies = } = hero;enemies; // =>
nu, i stedet for at være undefined
, er variablen enemies
standard til .
5. Aliaser
hvis du vil oprette variabler med andre navne end egenskaberne, kan du bruge funktionen aliasing af objektdestrukturering.
const { identifier: aliasIdentifier } = expression;
identifier
er navnet på den egenskab, der skal åbnes, aliasIdentifier
er variabelnavnet, og expression
skal evalueres til et objekt. Efter destruktureringen indeholder variablen aliasIdentifier
egenskabsværdien.
den tilsvarende kode:
const aliasIdentifier = expression.identifier;
her er et eksempel på objekt destrukturering alias funktion:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { realName: secretName } = hero;secretName; // => 'Bruce Wayne'
når man ser på const { realName: secretName } = hero
, definerer destruktureringen en ny variabel secretName
(aliasvariabel) og tildeler den værdien hero.realName
.
6. Udtrækning af egenskaber fra indlejrede objekter
i de foregående eksempler var objekterne almindelige: egenskaberne har primitive datatyper (f.eks. strenge).
ofte kan objekter indlejres i andre objekter. Med andre ord kan nogle egenskaber indeholde objekter.
i så fald kan du stadig bruge objektdestrukturerings-og adgangsegenskaberne fra dyb. Her er den grundlæggende syntaks:
const { nestedObjectProp: { identifier } } = expression;
nestedObjectProp
er navnet på den ejendom, der indeholder et indlejret objekt. identifier
er egenskabsnavnet for at få adgang fra det indlejrede objekt. expression
bør evaluere til det destruerede objekt.
efter destruktureringen indeholder variablen identifier
egenskabsværdien af det indlejrede objekt.
ovenstående syntaks svarer til:
const identifier = expression.nestedObjectProp.identifier;
niveauet af indlejring, du kan udtrække egenskaber fra, er ubegrænset. Hvis du vil udtrække egenskaber fra dyb, skal du blot tilføje flere indlejrede krøllede seler:
const { propA: { propB: { propC: { .... } } } } = object;
for eksempel indeholder objektet hero
et indlejret objekt { city: 'Gotham'}
.
const hero = { name: 'Batman', realName: 'Bruce Wayne', address: { city: 'Gotham' }};// Object destructuring:const { address: { city } } = hero;city; // => 'Gotham'
objektets ødelæggelse const { address: { city } } = hero
giver dig adgang til egenskaben city
fra det indlejrede objekt.
du kan udpakke egenskaber til variabler med et dynamisk navn (egenskabsnavnet er kendt ved kørsel):
const { : identifier } = expression;
propName
udtrykket skal evalueres til et egenskabsnavn (normalt en streng), og identifier
skal angive det variabelnavn, der er oprettet efter destruktureringen. Den anden expression
skal evaluere til det objekt, du gerne vil destruere.
en ækvivalent kode uden objekt ødelæggelse:
const identifier = expression;
lad os se på et eksempel, hvor prop
har egenskabsnavnet:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const prop = 'name';const { : name } = hero;name; // => 'Batman'
const { : name } = hero
er en objektdestrukturering, der tildeler variabel name
værdien hero
, hvor prop
er en variabel med egenskabsnavnet.
8. Rest objekt efter destrukturering
resten syntaks er nyttigt at indsamle de resterende egenskaber efter destrukturering:
const { identifier, ...rest } = expression;
hvor identifier
er navnet på ejendommen, der skal åbnes, og expression
skal evalueres til et objekt.
efter destruktureringen indeholder variablen identifier
egenskabsværdien. rest
variabel er et almindeligt objekt med de resterende egenskaber.
lad os for eksempel udtrække ejendommen name
, men hold resten af egenskaberne:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, ...realHero } = hero;realHero; // => { realName: 'Bruce Wayne' }
destruktureringen const { name, ...realHero } = hero
udtrækker egenskaben name
.
samtidig samles de resterende egenskaber (realName
i dette tilfælde) i variablen realHero
: { realName: 'Bruce Wayne' }
.
9. Almindelige brugssager
9.1 Bind egenskaber til variabler
som det ses i mange eksempler før, binder objektdestruktureringen egenskabsværdier til variabler.
objektdestruktureringen kan tildele værdier til variabler, der er erklæret ved hjælp af const
, let
og var
. Eller endda tildele til en allerede eksisterende variabel.
for eksempel, her er hvordan man destrukturerer ved hjælp af let
erklæring:
// letconst hero = { name: 'Batman',};let { name } = hero;name; // => 'Batman'
sådan destrueres ved hjælp af var
erklæring:
// varconst hero = { name: 'Batman',};var { name } = hero;name; // => 'Batman'
og hvordan man destruerer til en allerede erklæret variabel:
// existing variablelet name;const hero = { name: 'Batman',};({ name } = hero);name; // => 'Batman'
jeg finder det tilfredsstillende at kombinere for..of
cyklus med objekt ødelæggelse for at udtrække ejendommen med det samme:
const heroes = ;for (const { name } of heroes) { console.log(name); // logs 'Batman', 'Joker'}
9.2 Funktionsparameter destrukturering
generelt kan objektdestruktureringen placeres hvor som helst, hvor en opgave sker.
for eksempel kan du ødelægge et objekt lige inde i parameterlisten for en funktion:
const heroes = ;const names = heroes.map( function({ name }) { return name; });names; // =>
function({ name })
destrukturerer funktionsparameteren, hvilket skaber en variabel name
, der holder værdien af name
ejendom.
10. Resume
objektdestruktureringen er en kraftfuld funktion, der giver dig mulighed for at udtrække egenskaber fra et objekt og binde disse værdier til variabler.
jeg kan især godt lide objektdestrukturering er den kortfattede syntaks og evnen til at udtrække flere variabler i en erklæring.
forhåbentlig har mit indlæg hjulpet dig med at se, hvor nyttigt objekt ødelæggelse er!