object destructuring är en användbar JavaScript-funktion för att extrahera egenskaper från objekt och binda dem till variabler.
vad är bättre, objektförstöring kan extrahera flera egenskaper i ett uttalande, kan komma åt egenskaper från kapslade objekt och kan ställa in ett standardvärde om egenskapen inte existerar.
i det här inlägget förklarar jag hur man använder objektförstöring i JavaScript.
- 1. Behovet av objektförstöring
- 2. Extrahera en egenskap
- 3. Extrahera flera egenskaper
- 4. Standardvärden
- 5. Alias
- 6. Extrahera egenskaper från kapslade objekt
- 7. Extrahera en egenskap för dynamiskt namn
- 8. Rest-objekt efter destruktion
- 9. Vanliga användningsfall
- 9.1 Bind egenskaper till variabler
- 9.2 funktionsparameter destructuring
- 10. Sammanfattning
1. Behovet av objektförstöring
Tänk dig att du vill extrahera vissa egenskaper hos ett objekt. I en pre-ES2015 miljö, skulle du behöva skriva följande kod:
var hero = { name: 'Batman', realName: 'Bruce Wayne'};var name = hero.name;var realName = hero.realName;name; // => 'Batman',realName; // => 'Bruce Wayne'
egenskapen hero.name
värde tilldelas variabeln name
. Samma sätt hero.realName
värde tilldelas realName
.
ett sådant sätt att komma åt egenskaper och tilldela dem till variabler kräver standardkod. Genom att skriva var name = hero.name
måste du nämna name
– bindningen 2 gånger, och samma för realName
.
det är där objektförstöringssyntaxen är användbar: Du kan läsa en egenskap och tilldela dess värde till en variabel utan att duplicera egenskapsnamnet. Mer än så kan du läsa flera egenskaper från samma objekt i bara ett uttalande!
Låt oss refactor ovanstående skript och tillämpa objektet destructuring för att komma åt egenskaperna name
och realName
:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, realName } = hero;name; // => 'Batman',realName; // => 'Bruce Wayne'
const { name, realName } = hero
är ett objekt destructuring uppdrag. Detta uttalande definierar variablerna name
och realName
och tilldelar dem sedan värdena för egenskaper hero.name
och hero.realName
motsvarande.
jämför de 2 metoderna för att komma åt objektegenskaperna:
const name = hero.name;const realName = hero.realName;// is equivalent to:const { name, realName } = hero;
det är synligt att objektförstöringen är handier eftersom varken egenskapsnamnen eller Objektvariabeln dupliceras.
2. Extrahera en egenskap
den grundläggande syntaxen för objektförstöring är ganska enkel:
const { identifier } = expression;
där identifier
är namnet på egenskapen att komma åt och expression
ska utvärdera till ett objekt. Efter destruktionen innehåller variabeln identifier
egenskapsvärdet.
här är motsvarande kod med hjälp av en egendom accessor:
const identifier = expression.identifier;
Låt oss försöka förstöra objektet i praktiken:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name } = hero;name; // => 'Batman'
uttalandet const { name } = hero
definierar variabeln name
och initierar den med värdet hero.name
egenskap.
3. Extrahera flera egenskaper
för att förstöra objektet i flera egenskaper, räkna upp så många egenskaper som du vill lägga till kommatecken ,
däremellan:
const { identifier1, identifier2, ..., identifierN } = expression;
där identifier1
,…, identifierN
är namn på egenskaper att komma åt, och expression
ska utvärdera till ett objekt. Efter destruktionen innehåller variablerna identifier1
,…, identifierN
motsvarande egenskapsvärden.
här är motsvarande kod:
const identifier1 = expression.identifier1;const identifier2 = expression.identifier2;// ...const identifierN = expression.identifierN;
Låt oss ta en titt igen på exemplet från det första avsnittet, där 2 egenskaper extraheras:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, realName } = hero;name; // => 'Batman',realName; // => 'Bruce Wayne'
const { name, realName } = hero
skapar 2 variabler name
och realName
tilldelade med värden för motsvarande egenskaper hero.name
och hero.realName
.
4. Standardvärden
om det destruerade objektet inte har egenskapen specificerad i destructuring-tilldelningen, tilldelas variabeln undefined
. Låt oss se hur det händer:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { enemies } = hero;enemies; // => undefined
efter destruktion är variabeln enemies
undefined
eftersom egenskapen enemies
inte finns i objektet hero
.
lyckligtvis kan du ställa in ett standardvärde om egenskapen inte finns i det förstörda objektet. Här är den grundläggande syntaxen:
const { identifier = defaultValue } = expression;
där identifier
är namnet på egenskapen att komma åt och expression
ska utvärdera till ett objekt. Efter destruktionen innehåller variabeln identifier
egenskapsvärdet eller tilldelas med defaultValue
om identifier
– egenskapen inte existerar.
här är motsvarande kod:
const identifier = expression.identifier === undefined ? defaultValue : expression.identifier;
låt oss ändra det tidigare kodexemplet och använda standardvärdesfunktionen:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { enemies = } = hero;enemies; // =>
nu, istället för att vara undefined
, är variabeln enemies
standard .
5. Alias
om du vill skapa variabler med andra namn än egenskaperna kan du använda aliasing-funktionen för objektförstöring.
const { identifier: aliasIdentifier } = expression;
identifier
är namnet på egenskapen att komma åt, aliasIdentifier
är variabelnamnet och expression
ska utvärdera till ett objekt. Efter destruktionen innehåller variabeln aliasIdentifier
egenskapsvärdet.
motsvarande kod:
const aliasIdentifier = expression.identifier;
här är ett exempel på objektförstörande aliasfunktion:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { realName: secretName } = hero;secretName; // => 'Bruce Wayne'
om man tittar på const { realName: secretName } = hero
definierar destucturing en ny variabel secretName
(aliasvariabel) och tilldelar det värdet hero.realName
.
6. Extrahera egenskaper från kapslade objekt
i de tidigare exemplen var objekten vanliga: egenskaperna har primitiva datatyper (t.ex. strängar).
ofta kan objekt kapslas i andra objekt. Med andra ord kan vissa egenskaper innehålla objekt.
i så fall kan du fortfarande använda objektförstörande och åtkomstegenskaper från deep. Här är den grundläggande syntaxen:
const { nestedObjectProp: { identifier } } = expression;
nestedObjectProp
är namnet på den egendom som har ett kapslat objekt. identifier
är egenskapsnamnet för åtkomst från det kapslade objektet. expression
bör utvärdera till det förstörda objektet.
efter destruktionen innehåller variabeln identifier
egenskapsvärdet för det kapslade objektet.
ovanstående syntax motsvarar:
const identifier = expression.nestedObjectProp.identifier;
nestningsnivån du kan extrahera egenskaper från är obegränsad. Om du vill extrahera egenskaper från djup, lägg bara till fler kapslade lockiga hängslen:
const { propA: { propB: { propC: { .... } } } } = object;
till exempel innehåller objektet hero
ett kapslat objekt { city: 'Gotham'}
.
const hero = { name: 'Batman', realName: 'Bruce Wayne', address: { city: 'Gotham' }};// Object destructuring:const { address: { city } } = hero;city; // => 'Gotham'
objektet destructuring const { address: { city } } = hero
låter dig komma åt egenskapen city
från det kapslade objektet.
7. Extrahera en egenskap för dynamiskt namn
du kan extrahera egenskaper för variabler med ett dynamiskt namn (egenskapsnamnet är känt vid körning):
const { : identifier } = expression;
propName
uttrycket ska utvärderas till ett egenskapsnamn (vanligtvis en sträng) och identifier
ska ange variabelnamnet som skapats efter destruktionen. Den andra expression
ska utvärdera till objektet du vill förstöra.
en ekvivalent kod utan objektförstöring:
const identifier = expression;
Låt oss titta på ett exempel där prop
har Egenskapens namn:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const prop = 'name';const { : name } = hero;name; // => 'Batman'
const { : name } = hero
är en objektdestruktion som tilldelar variabeln name
värdet hero
, där prop
är en variabel som håller egenskapsnamnet.
8. Rest-objekt efter destruktion
rest-syntaxen är användbar för att samla de återstående egenskaperna efter destruktionen:
const { identifier, ...rest } = expression;
där identifier
är namnet på egenskapen att komma åt och expression
ska utvärdera till ett objekt.
efter destruktionen innehåller variabeln identifier
egenskapsvärdet. rest
variabel är ett vanligt objekt med de återstående egenskaperna.
låt oss till exempel extrahera egenskapen name
, men behåll resten av egenskaperna:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, ...realHero } = hero;realHero; // => { realName: 'Bruce Wayne' }
destructuring const { name, ...realHero } = hero
extraherar egenskapen name
.
samtidigt samlas de återstående egenskaperna (realName
i detta fall) i variabeln realHero
: { realName: 'Bruce Wayne' }
.
9. Vanliga användningsfall
9.1 Bind egenskaper till variabler
som sett i många exempel tidigare binder objektförstöringen egenskapsvärden till variabler.
objektförstöringen kan tilldela värden till variabler som deklarerats med const
, let
och var
. Eller till och med tilldela en redan befintlig variabel.
till exempel, så här förstör du med let
uttalande:
// letconst hero = { name: 'Batman',};let { name } = hero;name; // => 'Batman'
hur man förstör med var
uttalande:
// varconst hero = { name: 'Batman',};var { name } = hero;name; // => 'Batman'
och hur man förstör till en redan deklarerad variabel:
// existing variablelet name;const hero = { name: 'Batman',};({ name } = hero);name; // => 'Batman'
jag tycker att det är tillfredsställande att kombinera for..of
cykel med objektförstöring för att extrahera fastigheten direkt:
const heroes = ;for (const { name } of heroes) { console.log(name); // logs 'Batman', 'Joker'}
9.2 funktionsparameter destructuring
generellt kan objekt destructuring placeras var som helst där en tilldelning sker.
du kan till exempel förstöra ett objekt direkt i parameterlistan för en funktion:
const heroes = ;const names = heroes.map( function({ name }) { return name; });names; // =>
function({ name })
förstör funktionsparametern och skapar en variabel name
som håller värdet på egenskapen name
.
10. Sammanfattning
objektförstöringen är en kraftfull funktion som låter dig extrahera egenskaper från ett objekt och binda dessa värden till variabler.
jag tycker särskilt om objektförstöring är den korta syntaxen och förmågan att extrahera flera variabler i ett uttalande.
förhoppningsvis har mitt inlägg hjälpt dig att se hur användbar objektförstöring är!