10. Destrukce
10. Destrukce #
- 10.1. Přehled
- 10.1.1. Destrukce objektu
- 10.1.2. Destrukce pole
- 10.1.3. Kde lze destrukci použít?
- 10.2. Pozadí: vytváření dat versus extrahování dat
- 10.3. Vzory pro destrukci
- 10.3.1. Vyberte si, co potřebujete
- 10.4. Jak vzory přistupují k vnitřnostem hodnot?
- 10.4.1. Vzory objektů nutí hodnoty k objektům
- 10.4.2. Vzory polí pracují s iterables
- 10.5. Výchozí hodnoty
- 10.5.1.
undefined
spouští výchozí hodnoty - 10.5.2. Výchozí hodnoty jsou vypočteny na vyžádání
- 10.5.3. Výchozí hodnoty mohou odkazovat na jiné proměnné ve vzoru
- 10.5.4. Výchozí hodnoty pro vzory
- 10.5.5. Složitější výchozí hodnoty
- 10.5.1.
- 10.6. Další funkce destrukce objektů
- 10.6.1. Hodnota vlastnosti zkratky
- 10.6.2. Počítačové klíče vlastností
- 10.7. Další funkce destrukce pole
- 10.7.1. Elision
- 10.7.2. Operátor odpočinku (
...
)
- 10.8. Můžete přiřadit více než jen proměnné
- 10.9. Úskalí destrukce
- 10.9.1. Nezačínejte prohlášení s kudrnatou ortézou
- 10.10. Příklady destrukce
- 10.10.1. Destrukce vrácených polí
- 10.10.2. Destrukce vrácených objektů
- 10.10.3. Array-destructuring iterable values
- 10.10.4. Více návratových hodnot
- 10.11. Destrukční algoritmus
- 10.11.1. Algoritmus
- 10.11.2. Použití algoritmu
10.1 Přehled #
Destructuring je pohodlný způsob, jak získat více hodnot z dat uložených v (případně vnořených) objekty a Pole. Může být použit v místech, která přijímají data (například na levé straně přiřazení). Jak extrahovat hodnoty, je uvedeno pomocí vzorů(přečtěte si příklady).
10.1.1 destrukce objektů #
destrukce objektů:
Destructuring pomáhá při zpracování návratové hodnoty:
10.1.2 Pole destructuring #
Array destructuring (funguje pro všechny iterable hodnoty):
Destructuring pomáhá při zpracování návratové hodnoty:
10.1.3 Kde lze destructuring být použity? #
destrukce může být použita na následujících místech (ukazuji vzory polí, abych demonstroval; vzory objektů fungují stejně dobře):
můžete také destructure v for-of
smyčka:
10.2 Pozadí: Vytváření dat oproti získávání dat #
plně pochopit, co destructuring je, pojďme nejprve zkoumat jeho širším kontextu.
JavaScript má operace pro vytváření dat, jeden majetku v době,:
stejnou syntaxi lze použít k extrahovat data. Znovu, jedna vlastnost najednou:
Navíc, tam je syntaxe postavit více vlastností zároveň, přes objekt doslovný:
Před ES6, tam byl žádná odpovídající mechanismus pro získávání údajů. To je to, co je destrukce-umožňuje extrahovat více vlastností z objektu pomocí vzoru objektu. Například, na levé straně přiřazení:
můžete také destructure Pole pomocí vzorce:
10.3 vzory pro destrukci #
následující dvě strany se podílejí na destrukci:
- destruktivní zdroj: data, která mají být zničena. Například pravá strana destrukčního úkolu.
- Destructuring target: vzor používaný pro destrukci. Například levá strana destrukčního úkolu.
destrukční cíl je buď jedním ze tří vzorů:
- cíl úkolu. Například:
x
- cíl přiřazení je obvykle proměnná. Ale v destrukčním úkolu máte více možností, jak vysvětlím později.
- vzor objektu. Například:
{ first: "pattern", last: "pattern" }
- části vzoru objektu jsou vlastnosti, hodnoty vlastností jsou opět vzory (rekurzivně).
- vzor pole. Například:
- části vzoru Pole jsou prvky, prvky jsou opět vzory (rekurzivně).
to znamená, že můžete hnízdit vzory, libovolně hluboce:
10.3.1 Vybrat, co budete potřebovat #
Pokud jste destructure objekt, zmínit jen ty vlastnosti, které vás zajímá:
Pokud jste destructure Pole, můžete si vybrat pouze extrahovat prefix:
10.4 Jak vzorců přístup vnitřnosti hodnot? #
v zadání pattern = someValue
, jak se pattern
přístup co je uvnitř someValue
?
10.4.1 Objekt vzory donutit hodnoty objektů #
objekt vzor donucením destructuring zdroje na objekty před přístupem vlastnosti. To znamená, že to funguje s primitivní hodnoty:
10.4.1.1 Nedaří objekt-destructure hodnotu #
donucování k objektu není provedena pomocí Object()
, ale přes vnitřní provoz ToObject()
. Obě operace zpracovávají undefined
a null
odlišně.
Object()
převádí primitivní hodnoty wrapper objektů a listy objekty nedotčené:
It also converts undefined
and null
to empty objects:
In contrast, ToObject()
throws a TypeError
if it encounters undefined
or null
. Therefore, the following destructurings fail, even before destructuring accesses any properties:
v důsledku toho, můžete použít prázdný objekt vzor {}
zkontrolovat, zda hodnota je coercible k objektu. Jak jsme viděli, pouze undefined
a null
nejsou:
závorky kolem výrazů jsou nezbytné, protože příkazy nesmí začínat složenými závorkami v JavaScriptu (podrobnosti jsou vysvětleny později).
10.4.2 array patterns work with iterables #
Array destructuring používá iterátor, aby se dostal k prvkům zdroje. Proto můžete Array-destructure libovolnou hodnotu, která je iterable. Podívejme se na příklady iterabilních hodnot.
řetězce jsou iterovatelné:
nezapomeňte, že iterátor konec řetězce, vrátí kód body („znaky Unicode“, 21 bitů), kód jednotek („JavaScript znaky“, 16 bitů). (Další informace o Unicode naleznete v kapitole “ Kapitola 24. Unicode a JavaScript “ v „mluvení JavaScript“.) Například:
k prvkům sady nelze přistupovat pomocí indexů, ale můžete tak učinit pomocí iterátoru. Proto, destrukce pole funguje pro sady:
Set
iterator vždy vrací prvky v pořadí, v jakém byly vloženy, což je důvod, proč výsledek předchozího destructuring je vždy stejná.
10.4.2.1 Nedaří Pole-destructure hodnotu #
hodnota je iterable, pokud má metoda, jejíž klíč je Symbol.iterator
, která vrací objekt. Array-destructuring hodí TypeError
, pokud hodnota, která má být zničena, není iterable:
TypeError
je vyvolána ještě před vstupem prvky iterable, což znamená, že můžete použít prázdné Pole vzor zkontrolovat, zda hodnota je iterable:
10.5 Default hodnoty #
Výchozí hodnoty jsou volitelné funkce vzory. Poskytují záložní zdroj, pokud ve zdroji není nic nalezeno. Pokud část (vlastnost objektu nebo prvek pole) nemá ve zdroji shodu, je porovnána proti:
- jeho výchozí hodnota (pokud je zadána; je to volitelné)
-
undefined
(jinak)
podívejme se na příklad. Při následující destrukci nemá prvek na indexu 0 na pravé straně žádnou shodu. Proto destrukce pokračuje porovnáním x
proti 3, což vede k nastavení x
na 3.
můžete také použít výchozí hodnoty v objektu vzory:
10.5.1 undefined
spouští výchozí hodnoty #
Výchozí hodnoty jsou také použity v případě, že část má zápas a ten zápas je undefined
:
zdůvodnění tohoto chování je vysvětleno v následující kapitole, v části o výchozích hodnotách parametrů.
10.5.2 výchozí hodnoty se počítají na vyžádání #
samotné výchozí hodnoty se počítají pouze v případě potřeby. Jinými slovy, tento destructuring:
je ekvivalentní k:
můžete pozorovat, že pokud budete používat console.log()
:
In the second destructuring, the default value is not triggered and log()
is not called.
10.5.3 Default values can refer to other variables in the pattern #
A default value can refer to any variable, including other variables in the same pattern:
Nicméně, na pořadí záleží: proměnné x
a y
jsou deklarovány zleva doprava a produkovat ReferenceError
pokud jsou přístupné před jejich prohlášení:
10.5.4 Výchozí hodnoty pro vzory #
zatím jsme viděli jen výchozí hodnoty pro proměnné, ale můžete také spojit je s vzory:
Co to znamená? Vyvolejte pravidlo pro výchozí hodnoty: pokud část nemá ve zdroji shodu, destrukce pokračuje výchozí hodnotou.
prvek na indexu 0 je žádná shoda, což je důvod, proč destructuring pokračuje:
můžete snadno zjistit, proč věci fungují tímto způsobem, pokud jste nahradit vzor { prop: x }
s variabilní pattern
:
10.5.5 Složitější default hodnoty #
Pojďme dále prozkoumat výchozí hodnoty pro pole. V následujícím příkladu přiřadíme hodnotu x
pomocí výchozí hodnoty { prop: 123 }
:
Protože prvek Pole s indexem 0 nemá žádný zápas na pravé straně, destructuring pokračuje takto a x
je nastavena na 123.
Nicméně, x
není přiřazena hodnota tímto způsobem, pokud na pravé straně je prvek na indexu 0, protože pak výchozí hodnota není spuštěna.
v tomto případě destrukce pokračuje:
Proto, pokud chcete, x
123, pokud objekt nebo vlastnost chybí, musíte zadat výchozí hodnotu pro x
sám:
Tady, destructuring pokračuje takto, nezávisle na tom, zda pravé straně je nebo
.
10.6 Další objekt destructuring funkce #
10.6.1 hodnoty Nemovitosti zkrácený zápis #
hodnoty Nemovitosti zkrácený zápis jsou funkce objektu literály: Pokud je hodnota vlastnosti proměnná, která má stejný název jako klíč vlastnosti, Můžete klíč vynechat. To funguje pro destructuring taky:
můžete také kombinovat hodnoty nemovitosti zkrácený zápis s výchozí hodnoty:
10.6.2 Počítačová vlastnost klíče #
Počítačová majetku klíče jsou jiný objekt doslovný funkce, která také pracuje pro destructuring. Klíč vlastnosti můžete zadat pomocí výrazu, pokud jej umístíte do hranatých závorek:
Počítačová vlastnost klíče umožní destructure vlastnosti, jejichž klíče jsou symboly:
10.7 Další Pole destructuring funkce #
10.7.1 Elision #
Elision umožňuje použít syntaxi Array „díry“ přeskočit prvky během destructuring:
10.7.2 Zbytek obsluhy (...
) #
zbytek provozovatel umožňuje extrahovat zbývající prvky iterable do Pole. Pokud je tento operátor použit uvnitř vzoru pole, musí být poslední:
pokud operátor nemůže najít žádné prvky, porovnává svůj operand s prázdným polem. To znamená, že nikdy neprodukuje undefined
nebo null
. Například:
operandu o zbytek provozovatel nemusí být variabilní, můžete použít vzory, příliš:
zbytek operátor spouští následující destructuring:
10.8 můžete přiřadit více než jen proměnné #
Pokud přiřadíte přes destructuring, každý úkol, cíl může být vše, co je povoleno na levé straně normální přiřazení.
například, odkaz na ubytování (obj.prop
):
Nebo odkaz na prvek Pole (arr
):
můžete také přiřadit k vlastnosti objektu a prvky Pole přes zbytek operátor (...
):
Pokud deklarujete proměnné nebo definovat parametry pomocí destructuring pak musíte použít jednoduché identifikátory, nemůžete odkazovat na vlastnosti objektu a Pole prvků.
10.9 Úskalí destructuring #
Tam jsou dvě věci, na paměti při použití destructuring:
- nemůžete začít prohlášení s složená závorka.
- během destrukce můžete buď deklarovat proměnné, nebo jim přiřadit, ale ne obě.
další dvě části obsahují podrobnosti.
10.9.1 nezačínejte příkaz složenou vzpěrou #
protože bloky kódu začínají složenou vzpěrou, příkazy nesmí začínat jednou. To je nešťastné, když se pomocí objektu destructuring v přiřazení:
práce-kolem je postavit kompletní výraz v závorkách:
následující syntaxe nefunguje:
S let
, var
a const
, kudrnaté rovnátka nikdy způsobit problémy:
10.10 příkladů destrukce #
začněme několika menšími příklady.
smyčka for-of
podporuje destrukci:
k výměně hodnot můžete použít destrukci. To je něco, co by motory mohly optimalizovat, takže by nebylo vytvořeno žádné pole.
můžete použít destructuring rozdělit Pole:
10.10.1 Destructuring vrátil Pole #
Některé vestavěné JavaScript operace vrátit Pole. Destrukce pomáhá s jejich zpracováním:
Pokud vás zajímá pouze ve skupinách (a ne v kompletní zápas, all
), můžete použít elision přeskočit prvek pole na index 0:
exec()
se vrací null
pokud regulární výraz se neshoduje. Bohužel nemůžete zpracovat null
pomocí výchozích hodnot, proto musíte v tomto případě použít operátor Or (||
:
Array.prototype.split()
vrátí pole. Proto je destrukce užitečná, pokud máte zájem o prvky, nikoli o pole:
10.10.2 Destructuring vrátil objekty #
Destructuring je také užitečné pro extrakci dat z objektů, které jsou vráceny pomocí funkcí, nebo metod. Například iterátorová metoda next()
vrací objekt se dvěma vlastnostmi, done
a value
. Následující kód zaznamenává všechny prvky pole arr
přes iterátor iter
. Destructuring se používá v souladu.
10.10.3 Pole-destructuring iterable hodnoty #
Pole-destructuring pracuje s jakýmkoliv iterable hodnotu. To je občas užitečné:
10.10.4 Více návratové hodnoty #
vidět užitečnost více návratových hodnot, pojďme implementovat funkci findElement(a, p)
, který hledá první prvek v Poli a
, pro které je funkce p
výnosy true
. Otázka zní: co by se mělo findElement()
vrátit? Někdy se člověk zajímá o samotný prvek, někdy o jeho index, někdy o oba. Následující implementace vrací obojí.
funkce iteruje přes všechny prvky array
, přes Pole metoda entries()
, která vrací iterable párů (linka A). Části párů jsou přístupné prostřednictvím destrukce.
Pojďme použít findElement()
:
Několik ECMAScript 6 funkce nám umožnila psát stručnější kód: zpětné šipky, funkce, návratová hodnota je destructured přes objekt vzor s vlastnost hodnota zkrácený zápis.
Díky index
a element
také se odkazovat na vlastnost klíče, pořadí, v jakém jsme o nich nezáleží. Můžeme je vyměnit a nic se nezmění:
Máme úspěšně zpracována případě nutnosti obě index a prvek. Co když nás zajímá pouze jeden z nich? Ukazuje se, že díky ECMAScript 6 se o to může postarat i naše implementace. A syntaktická režie ve srovnání s funkcemi s jedinými návratovými hodnotami je minimální.
pokaždé získáme pouze hodnotu jedné vlastnosti, kterou potřebujeme.
10.11 destrukční algoritmus #
tato část se zabývá destrukcí z jiného úhlu: jako rekurzivním algoritmem porovnávání vzorů.
na konci použiji algoritmus k vysvětlení rozdílu mezi následujícími dvěma deklaracemi funkcí.
10.11.1 algoritmus #
destructuring úkolu vypadá takto:
chceme použít pattern
k extrahování dat z value
. Nyní popíšu algoritmus, který je ve funkčním programování znám jako pattern matching (krátký: matching). Algoritmus určuje provozovatel ←
(„utkání“) pro destructuring úkol, který odpovídá pattern
proti value
a přiřadí k proměnné, zatímco dělá tak:
algoritmus je uvedeno přes rekurzivní pravidla, která se od sebe oba operandy ←
operátor. Deklarativní notace si může zvyknout, ale SPECIFIKACE algoritmu je stručnější. Každé pravidlo má dvě části:
- hlava (první řádek) popisuje podmínku, která spouští pravidlo.
- tělo (zbývající řádky) popisuje, co se stane, když je pravidlo spuštěno.
podívejme se na příklad:
- (2c)
{key: "pattern", "properties"} ← obj
- (2e)
{} ← obj
(žádné vlastnosti doleva)
V článku (2c), hlavy znamená, že toto pravidlo je proveden, pokud je objekt vzor s alespoň jedním majetku a nula nebo více zbývající vlastnosti. Tento vzor je porovnán s hodnotou obj
. Efekt tohoto pravidla je, že provádění pokračuje s hodnoty nemovitosti vzor být uzavřeno proti obj.key
a zbývající vlastnosti jsou porovnávány proti obj
.
v pravidle (2e) hlava znamená, že toto pravidlo je provedeno, pokud je vzor prázdného objektu {}
porovnán s hodnotou obj
. Pak se nedá nic dělat.
kdykoli je algoritmus vyvolán, pravidla se kontrolují shora dolů a provede se pouze první pravidlo, které je použitelné.
zobrazuji pouze algoritmus pro destrukční přiřazení. Deklarace destruktivních proměnných a definice destruktivních parametrů fungují podobně.
nepokrývám pokročilé funkce (počítačové klíče vlastností; zkratky hodnoty vlastností; vlastnosti objektu a prvky pole jako cíle přiřazení), buď. Pouze základy.
10.11.1.1 Vzory #
vzor je buď:
- variabilní:
x
- objekt vzor:
{"properties"}
- Maticový vzor:
Každá z následujících částí popisuje jeden z těchto tří případů.
následující tři oddíly specifikují, jak zacházet s těmito třemi případy. Každá sekce obsahuje jedno nebo více očíslovaných pravidel.
10.11.1.2 Variabilní #
- (1)
x ← value
(včetněundefined
anull
)
10.11.1.3 Objekt vzor #
- (2a)
{"properties"} ← undefined
- (2b)
{"properties"} ← null
- (2c)
{key: "pattern", "properties"} ← obj
- (2d)
{key: "pattern" = default_value, "properties"} ← obj
- (2e)
{} ← obj
(žádné vlastnosti doleva)
10.11.1.4 Pole vzor #
Pole vzor a iterable. Algoritmus pro Pole destructuring začíná s Řadou vzoru a iterable:
- (3a)
← non_iterable
assert(!isIterable(non_iterable))
- (3b)
← iterable
assert(isIterable(iterable))
Helper funkce:
prvky Pole a iterator. Algoritmus pokračuje prvky vzoru (levá strana šipky) a iterátoru, který byl získán z iterovatelné (pravá strana šipky).
- (3c)
"pattern", "elements" ← iterator
- (3d)
"pattern" = default_value, "elements" ← iterator
- (3e)
, "elements" ← iterator
(díry, elision)
- (3f)
..."pattern" ← iterator
(vždy poslední část!)
- (3g)
← iterator
(žádné prvky vlevo)
Helper funkce:
10.11.2 Použití algoritmu #
V ECMAScript 6, můžete simulovat pojmenované parametry, pokud volající používá objekt doslovný a volaný používá destructuring. Tato simulace je podrobně vysvětlena v kapitole o manipulaci s parametry. Následující kód ukazuje příklad: funkce move1()
má dvě pojmenované parametry, x
a y
:
Existují tři výchozí hodnoty v souladu S:
- první dvě výchozí hodnoty umožňují vynechat
x
ay
. - třetí výchozí hodnota umožňuje volat
move1()
bez parametrů (jako v posledním řádku).
ale proč byste definovali parametry jako v předchozím úryvku kódu? Proč ne takto-což je také zcela legální kód ES6?
abychom zjistili, proč je move1()
správný, použijeme obě funkce pro dva příklady. Než to uděláme, podívejme se, jak lze průchod parametrů vysvětlit pomocí párování.
10.11.2.1 Pozadí: předávání parametrů přes odpovídající #
Pro volání funkce, formální parametry (uvnitř definice funkce) jsou porovnávány skutečné parametry (uvnitř volání funkce). Jako příklad si vezměte následující definici funkce a následující volání funkce.
parametry a
a b
jsou nastaveny podobně jako následující destructuring.
10.11.2.2 použití move2()
#
podívejme se, jak destrukce funguje pro move2()
.
Příklad 1. move2()
vede k této destructuring:
jeden prvek Pole na levé straně nemá zápas na pravé straně, což je důvod, proč {x,y}
je porovnávány výchozí hodnota a ne proti dat z pravé straně pravidla (3b, 3d):
Na levé straně obsahuje hodnoty nemovitosti zkrácený zápis, to je zkratka pro:
Tento destructuring vede k následující dva úkoly (pravidla 2c, 1):
Příklad 2. Podívejme se na volání funkce move2({z:3})
, které vede k následující destrukci:
na pravé straně je prvek pole v indexu 0. Proto je výchozí hodnota ignorována a dalším krokem je (pravidlo 3d):
to vede k tomu, že jak x
, tak y
jsou nastaveny na undefined
, což není to, co chceme.
10.11.2.3 použití move1()
#
zkusme move1()
.
Příklad 1: move1()
nemáme prvek Pole s indexem 0 je na pravé straně a použít výchozí hodnotu (pravidlo 3d):
Na levé straně obsahuje hodnoty nemovitosti zkrácený zápis, což znamená, že tento destructuring je ekvivalentní:
ani vlastnost x
ani vlastnost y
nemají shodu na pravé straně. Proto, výchozí hodnoty jsou použity, a následující destructurings jsou prováděny další (pravidlo 2d):
To vede k následující úkoly (čl. 1):
Příklad 2: move1({z:3})
První prvek Pole vzor má zápas na pravé straně a zápas je použít, aby i nadále destructuring (článek 3d):
Jako v příkladu 1, nejsou tam žádné vlastnosti x
a y
na pravé straně a výchozí hodnoty jsou použity:
10.11.2.4 Závěr #
příklady ukazují, že výchozí hodnoty jsou znakem vzor části (vlastnosti objektu, nebo prvky Pole). Pokud část nemá shodu nebo je porovnána s undefined
, použije se výchozí hodnota. To znamená, že vzor je místo toho porovnán s výchozí hodnotou.