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ů:
const
obj
=
{
first
:
'Jane'
,
last
:
'Doe'
};
const
{
first
:
f
,
last
:
l
}
=
obj
;
// f = 'Jane'; l = 'Doe'
// {prop} is short for {prop: prop}
const
{
first
,
last
}
=
obj
;
// first = 'Jane'; last = 'Doe'
Destructuring pomáhá při zpracování návratové hodnoty:
const
obj
=
{
foo
:
123
};
const
{
writable
,
configurable
}
=
Object
.
getOwnPropertyDescriptor
(
obj
,
'foo'
);
console
.
log
(
writable
,
configurable
);
// true true
10.1.2 Pole destructuring #
Array destructuring (funguje pro všechny iterable hodnoty):
const
iterable
=
;
const
=
iterable
;
// x = 'a'; y = 'b'
Destructuring pomáhá při zpracování návratové hodnoty:
const
=
/^(\d\d\d\d)-(\d\d)-(\d\d)$/
.
exec
(
'2999-12-31'
);
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):
// Variable declarations:
const
=
;
let
=
;
var
=
;
// Assignments:
=
;
// Parameter definitions:
function
f
()
{
···
}
f
();
můžete také destructure v for-of
smyčka:
const
arr
=
;
for
(
const
of
arr
.
entries
())
{
console
.
log
(
index
,
element
);
}
// Output:
// 0 a
// 1 b
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ě,:
const
obj
=
{};
obj
.
first
=
'Jane'
;
obj
.
last
=
'Doe'
;
stejnou syntaxi lze použít k extrahovat data. Znovu, jedna vlastnost najednou:
const
f
=
obj
.
first
;
const
l
=
obj
.
last
;
Navíc, tam je syntaxe postavit více vlastností zároveň, přes objekt doslovný:
const
obj
=
{
first
:
'Jane'
,
last
:
'Doe'
};
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í:
const
{
first
:
f
,
last
:
l
}
=
obj
;
můžete také destructure Pole pomocí vzorce:
const
=
;
// x = 'a'; y = 'b'
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:
const
obj
=
{
a
:
,
b
:
true
};
const
{
a
:
}
=
obj
;
// f = 123
10.3.1 Vybrat, co budete potřebovat #
Pokud jste destructure objekt, zmínit jen ty vlastnosti, které vás zajímá:
const
{
x
:
x
}
=
{
x
:
7
,
y
:
3
};
// x = 7
Pokud jste destructure Pole, můžete si vybrat pouze extrahovat prefix:
const
=
;
// x='a'; y='b';
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:
const
{
length
:
len
}
=
'abc'
;
// len = 3
const
{
toString
:
s
}
=
123
;
// s = Number.prototype.toString
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é:
> typeof Object('abc')'object'> var obj = {};> Object(obj) === objtrue
It also converts undefined
and null
to empty objects:
> Object(undefined){}> Object(null){}
In contrast, ToObject()
throws a TypeError
if it encounters undefined
or null
. Therefore, the following destructurings fail, even before destructuring accesses any properties:
const
{
prop
:
x
}
=
undefined
;
// TypeError
const
{
prop
:
y
}
=
null
;
// TypeError
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:
({}
=
);
// OK, Arrays are coercible to objects
({}
=
'abc'
);
// OK, strings are coercible to objects
({}
=
undefined
);
// TypeError
({}
=
null
);
// TypeError
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é:
const
=
'abc'
;
// x='a'; y=
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:
const
=
'a\uD83D\uDCA9c'
;
// x='a'; y='\uD83D\uDCA9'; z='c'
k prvkům sady nelze přistupovat pomocí indexů, ale můžete tak učinit pomocí iterátoru. Proto, destrukce pole funguje pro sady:
const
=
new
Set
();
// x='a'; y='b';
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:
let
x
;
=
;
// OK, Arrays are iterable
=
'abc'
;
// OK, strings are iterable
=
{
*
()
{
yield
1
}
};
// OK, iterable
=
{};
// TypeError, empty objects are not iterable
=
undefined
;
// TypeError, not iterable
=
null
;
// TypeError, not 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:
=
{};
// TypeError, empty objects are not iterable
=
undefined
;
// TypeError, not iterable
=
null
;
// TypeError, not 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.
const
=
;
// x = 3; y = undefined
můžete také použít výchozí hodnoty v objektu vzory:
const
{
foo
:
x
=
3
,
bar
:
y
}
=
{};
// x = 3; y = undefined
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
:
const
=
;
// x = 1
const
{
prop
:
y
=
2
}
=
{
prop
:
undefined
};
// y = 2
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:
const
{
prop
:
y
=
someFunc
()}
=
someValue
;
je ekvivalentní k:
let
y
;
if
(
someValue
.
prop
===
undefined
)
{
y
=
someFunc
();
}
else
{
y
=
someValue
.
prop
;
}
můžete pozorovat, že pokud budete používat console.log()
:
> function log(x) { console.log(x); return 'YES' }> const = ;> a'YES'> const = ;> b123
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:
const
=
;
// x=3; y=3
const
=
;
// x=7; y=7
const
=
;
// x=7; y=2
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í:
const
=
;
// ReferenceError
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:
const
=
;
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:
const
{
prop
:
x
}
=
{};
// x = undefined
můžete snadno zjistit, proč věci fungují tímto způsobem, pokud jste nahradit vzor { prop: x }
s variabilní pattern
:
const
=
;
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 }
:
const
=
;
Protože prvek Pole s indexem 0 nemá žádný zápas na pravé straně, destructuring pokračuje takto a x
je nastavena na 123.
const
{
prop
:
x
}
=
{
prop
:
123
};
// x = 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.
const
=
;
v tomto případě destrukce pokračuje:
const
{
prop
:
x
}
=
{};
// x = undefined
Proto, pokud chcete, x
123, pokud objekt nebo vlastnost chybí, musíte zadat výchozí hodnotu pro x
sám:
const
=
;
Tady, destructuring pokračuje takto, nezávisle na tom, zda pravé straně je nebo
.
const
{
prop
:
x
=
123
}
=
{};
// x = 123
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:
const
{
x
,
y
}
=
{
x
:
11
,
y
:
8
};
// x = 11; y = 8
// Same as:
const
{
x
:
x
,
y
:
y
}
=
{
x
:
11
,
y
:
8
};
můžete také kombinovat hodnoty nemovitosti zkrácený zápis s výchozí hodnoty:
const
{
x
,
y
=
1
}
=
{};
// x = undefined; y = 1
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:
const
FOO
=
'foo'
;
const
{
:
f
}
=
{
foo
:
123
};
// f = 123
Počítačová vlastnost klíče umožní destructure vlastnosti, jejichž klíče jsou symboly:
// Create and destructure a property whose key is a symbol
const
KEY
=
Symbol
();
const
obj
=
{
:
'abc'
};
const
{
:
x
}
=
obj
;
// x = 'abc'
// Extract Array.prototype
const
{
:
func
}
=
;
console
.
log
(
typeof
func
);
// function
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:
const
=
;
// x = 'c'; y = 'd'
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í:
const
=
;
// x='a'; y=
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:
const
=
;
// x='a'; y=undefined; z=
operandu o zbytek provozovatel nemusí být variabilní, můžete použít vzory, příliš:
const
]
=
;
// x = 'a'; y = 'b'; z = 'c'
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
):
const
obj
=
{};
({
foo
:
obj
.
prop
}
=
{
foo
:
123
});
console
.
log
(
obj
);
// {prop:123}
Nebo odkaz na prvek Pole (arr
):
const
arr
=
;
({
bar
:
arr
}
=
{
bar
:
true
});
console
.
log
(
arr
);
//
můžete také přiřadit k vlastnosti objektu a prvky Pole přes zbytek operátor (...
):
const
obj
=
{};
=
;
// first = 'a'; obj.prop =
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í:
{
a
,
b
}
=
someObject
;
// SyntaxError
práce-kolem je postavit kompletní výraz v závorkách:
({
a
,
b
}
=
someObject
);
// OK
následující syntaxe nefunguje:
({
a
,
b
})
=
someObject
;
// SyntaxError
S let
, var
a const
, kudrnaté rovnátka nikdy způsobit problémy:
const
{
a
,
b
}
=
someObject
;
// OK
10.10 příkladů destrukce #
začněme několika menšími příklady.
smyčka for-of
podporuje destrukci:
const
map
=
new
Map
().
set
(
false
,
'no'
).
set
(
true
,
'yes'
);
for
(
const
of
map
)
{
console
.
log
(
key
+
' is '
+
value
);
}
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:
const
=
;
// first = 'a'; rest =
10.10.1 Destructuring vrátil Pole #
Některé vestavěné JavaScript operace vrátit Pole. Destrukce pomáhá s jejich zpracováním:
const
=
/^(\d\d\d\d)-(\d\d)-(\d\d)$/
.
exec
(
'2999-12-31'
);
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:
const
=
/^(\d\d\d\d)-(\d\d)-(\d\d)$/
.
exec
(
'2999-12-31'
);
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 (||
:
const
=
/^(\d\d\d\d)-(\d\d)-(\d\d)$/
.
exec
(
someStr
)
||
;
Array.prototype.split()
vrátí pole. Proto je destrukce užitečná, pokud máte zájem o prvky, nikoli o pole:
const
cells
=
'Jane\tDoe\tCTO'
const
=
cells
.
split
(
'\t'
);
console
.
log
(
firstName
,
lastName
,
title
);
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.
const
arr
=
;
const
iter
=
arr
();
while
(
true
)
{
const
{
done
,
value
}
=
iter
.
next
();
// (A)
if
(
done
)
break
;
console
.
log
(
value
);
}
10.10.3 Pole-destructuring iterable hodnoty #
Pole-destructuring pracuje s jakýmkoliv iterable hodnotu. To je občas užitečné:
const
=
new
Set
().
add
(
'a'
).
add
(
'b'
);
// x = 'a'; y = 'b'
const
=
'foo'
;
// a = 'f'; b = 'o'
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í.
function
findElement
(
array
,
predicate
)
{
for
(
const
of
array
.
entries
())
{
// (A)
if
(
predicate
(
element
,
index
,
array
))
{
// We found an element:
return
{
element
,
index
};
// Same as (property value shorthands):
// { element: element, index: index }
}
}
// We couldn't find anything; return failure values:
return
{
element
:
undefined
,
index
:
-
1
};
}
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()
:
const
arr
=
;
const
{
element
,
index
}
=
findElement
(
arr
,
x
=>
x
%
2
===
0
);
// element = 8, index = 1
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í:
const
{
index
,
element
}
=
findElement
(
···
);
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í.
const
a
=
;
const
{
element
}
=
findElement
(
a
,
x
=>
x
%
2
===
0
);
// element = 8
const
{
index
}
=
findElement
(
a
,
x
=>
x
%
2
===
0
);
// index = 1
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í.
function
move
({
x
=
0
,
y
=
0
}
=
{})
{
···
}
function
move
({
x
,
y
}
=
{
x
:
0
,
y
:
0
})
{
···
}
10.11.1 algoritmus #
destructuring úkolu vypadá takto:
"
pattern
"
=
"
value
"
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:
"
pattern
"
←
"
value
"
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
"
pattern
"
←
obj
.
key
{
"
properties
"
}
←
obj
- (2e)
{} ← obj
(žádné vlastnosti doleva)
// Nothing to do
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
)
x
=
value
10.11.1.3 Objekt vzor #
- (2a)
{"properties"} ← undefined
throw
new
TypeError
();
- (2b)
{"properties"} ← null
throw
new
TypeError
();
- (2c)
{key: "pattern", "properties"} ← obj
"
pattern
"
←
obj
.
key
{
"
properties
"
}
←
obj
- (2d)
{key: "pattern" = default_value, "properties"} ← obj
const
tmp
=
obj
.
key
;
if
(
tmp
!==
undefined
)
{
"
pattern
"
←
tmp
}
else
{
"
pattern
"
←
default_value
}
{
"
properties
"
}
←
obj
- (2e)
{} ← obj
(žádné vlastnosti doleva)
// Nothing to do
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))
throw
new
TypeError
();
- (3b)
← iterable
assert(isIterable(iterable))
const
iterator
=
iterable
();
"
elements
"
←
iterator
Helper funkce:
function
isIterable
(
value
)
{
return
(
value
!==
null
&&
typeof
value
===
'object'
&&
typeof
value
===
'function'
);
}
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
"
pattern
"
←
getNext
(
iterator
)
// undefined after last item
"
elements
"
←
iterator
- (3d)
"pattern" = default_value, "elements" ← iterator
const
tmp
=
getNext
(
iterator
);
// undefined after last item
if
(
tmp
!==
undefined
)
{
"
pattern
"
←
tmp
}
else
{
"
pattern
"
←
default_value
}
"
elements
"
←
iterator
- (3e)
, "elements" ← iterator
(díry, elision)
getNext
(
iterator
);
// skip
"
elements
"
←
iterator
- (3f)
..."pattern" ← iterator
(vždy poslední část!)
const
tmp
=
;
for
(
const
elem
of
iterator
)
{
tmp
.
push
(
elem
);
}
"
pattern
"
←
tmp
- (3g)
← iterator
(žádné prvky vlevo)
// Nothing to do
Helper funkce:
function
getNext
(
iterator
)
{
const
{
done
,
value
}
=
iterator
.
next
();
return
(
done
?
undefined
:
value
);
}
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
:
function
move1
({
x
=
0
,
y
=
0
}
=
{})
{
// (A)
return
;
}
move1
({
x
:
3
,
y
:
8
});
//
move1
({
x
:
3
});
//
move1
({});
//
move1
();
//
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?
function
move2
({
x
,
y
}
=
{
x
:
0
,
y
:
0
})
{
return
;
}
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.
function
func
(
a
=
0
,
b
=
0
)
{
···
}
func
(
1
,
2
);
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):
{
x
,
y
}
←
{
x
:
0
,
y
:
0
}
Na levé straně obsahuje hodnoty nemovitosti zkrácený zápis, to je zkratka pro:
{
x
:
x
,
y
:
y
}
←
{
x
:
0
,
y
:
0
}
Tento destructuring vede k následující dva úkoly (pravidla 2c, 1):
x
=
0
;
y
=
0
;
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):
{
x
,
y
}
←
{
z
:
3
}
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):
{
x
=
0
,
y
=
0
}
←
{}
Na levé straně obsahuje hodnoty nemovitosti zkrácený zápis, což znamená, že tento destructuring je ekvivalentní:
{
x
:
x
=
0
,
y
:
y
=
0
}
←
{}
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):
x
←
0
y
←
0
To vede k následující úkoly (čl. 1):
x
=
0
y
=
0
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):
{
x
=
0
,
y
=
0
}
←
{
z
:
3
}
Jako v příkladu 1, nejsou tam žádné vlastnosti x
a y
na pravé straně a výchozí hodnoty jsou použity:
x
=
0
y
=
0
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.