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.
undefinedspouš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ů:
constobj={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:
constobj={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):
constiterable=;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:functionf(){···}f();
můžete také destructure v for-of smyčka:
constarr=;for(constofarr.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ě,:
constobj={};obj.first='Jane';obj.last='Doe';
stejnou syntaxi lze použít k extrahovat data. Znovu, jedna vlastnost najednou:
constf=obj.first;constl=obj.last;
Navíc, tam je syntaxe postavit více vlastností zároveň, přes objekt doslovný:
constobj={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:
constobj={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 = 3const{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;// TypeErrorconst{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=newSet();// 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:
letx;=;// OK, Arrays are iterable='abc';// OK, strings are iterable={*(){yield1}};// 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 = 1const{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:
lety;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=3const=;// x=7; y=7const=;// 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:
constFOO='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 symbolconstKEY=Symbol();constobj={:'abc'};const{:x}=obj;// x = 'abc'// Extract Array.prototypeconst{:func}=;console.log(typeoffunc);// 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):
constobj={};({foo:obj.prop}={foo:123});console.log(obj);// {prop:123}
Nebo odkaz na prvek Pole (arr):
constarr=;({bar:arr}={bar:true});console.log(arr);//
můžete také přiřadit k vlastnosti objektu a prvky Pole přes zbytek operátor (...):
constobj={};=;// 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:
constmap=newMap().set(false,'no').set(true,'yes');for(constofmap){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:
constcells='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.
constarr=;constiter=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=newSet().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í.
functionfindElement(array,predicate){for(constofarray.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():
constarr=;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í.
consta=;const{element}=findElement(a,x=>x%2===0);// element = 8const{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í.
functionmove({x=0,y=0}={}){···}functionmove({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ěundefinedanull)
x=value
10.11.1.3 Objekt vzor #
- (2a)
{"properties"} ← undefined
thrownewTypeError(); - (2b)
{"properties"} ← null
thrownewTypeError(); - (2c)
{key: "pattern", "properties"} ← obj
"pattern"←obj.key{"properties"}←obj - (2d)
{key: "pattern" = default_value, "properties"} ← obj
consttmp=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_iterableassert(!isIterable(non_iterable))
thrownewTypeError(); - (3b)
← iterableassert(isIterable(iterable))
constiterator=iterable();"elements"←iterator
Helper funkce:
functionisIterable(value){return(value!==null&&typeofvalue==='object'&&typeofvalue==='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
consttmp=getNext(iterator);// undefined after last itemif(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!)
consttmp=;for(constelemofiterator){tmp.push(elem);}"pattern"←tmp - (3g)
← iterator(žádné prvky vlevo)
// Nothing to do
Helper funkce:
functiongetNext(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:
functionmove1({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
xay. - 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?
functionmove2({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.
functionfunc(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←0y←0
To vede k následující úkoly (čl. 1):
x=0y=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=0y=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.