2016-02-07 18 views
6

Przeglądałem kod innych ludzi i podczas gdy ES2015 w ogóle wykorzystuje trochę czasu, jednak wciąż utknąłem z Destructuring.Zrozumienie kontekstu nawiasów klamrowych '{}'

Poprzednio w języku Javascript klamry kręcone {} były używane do bloków lub obiektów. na przykład

// Curly Brackets Block 
If() { 
    ... 
} 

// Curly Brackets in Obj 
var obj = { 
    a : 1, 
    ... 
} 

Jednak rozpad, ponownie i ponownie zobaczyć następującą składnię:

let a = ({ a, b }) => { 
} 

Moje pytanie jest pojemnik argumenty rzeczywisty przedmiot lub po prostu blok? Proszę wyjaśnić, czy następuje taka sama jak powyższym kodzie:

let a = (a, b) => { 
} 

EDIT: Moje zrozumienie (jak dotąd) z lektury artykułu Axel Rauschmayers na Destruturing jest to, że są tylko mapowania rekwizyty. w nowy Obj zawsze? I.e:

let a = { first : a, second : b } = AnObj; 
=== 
a.a === AnObj.first; 
a.b === AnObj.second; 

Czy powyższe pytanie jest prawidłowe? Czy obiekt zawsze tworzy instancję? Jednak to nie ma sensu, jak w powyższej funkcji, obiekt w ten sposób stworzony dla rekwizytów byłby obiektem anonimowym, prawda?

Dziękujemy,

+1

Przeczytaj ten jeden, będzie Ci dużo [destructuring] (https://github.com/getify/You-Dont-Know-JS/blob/master/es6%20&%20beyond /ch2.md#destructuring) – Vardius

+0

Jeśli naprawdę chcesz wiedzieć, co się stanie, gdy przetwarzanie destruktury zostanie przetworzone, zajrzyj do specyfikacji: http://www.ecma-international.org/ecma-262/6.0/#sec -destructuring-assignment –

Odpowiedz

2

Nie, nawiasy klamrowe w destrukturyzacji nie tworzą bloku ani literału obiektu.

Zdecydowanie nie są blokami, ponieważ nie są instrukcją (i nie zawierają listy instrukcji), są wyrażeniem , takim jak literałem obiektu. W rzeczywistości mają one nawet tę samą składnię, co literał obiektowy, a jedyną różnicą jest to, że znajdują się one w położeniu celu przypisania (lewa strona operatora przypisania) lub parametru funkcji.

Czy let a = ({ a, b }) => {…} jest taki sam jak let a = (a, b) => {…}?

Nie, naprawdę nie. Obie listy parametrów deklarują zmienne a i b dla zakresu funkcji, ale pierwsza funkcja oczekuje obiektu z właściwościami .a i .b, podczas gdy druga funkcja oczekuje dwóch argumentów.

Moje rozumienie polega na tym, że po prostu odwzorowujemy właściwości w nowy obiekt?

Nie. Nie utworzono/utworzono nowego obiektu. Jest tylko obiekt, który przekazujesz (prawa strona). I jest to zniszczony - "rozebrany" - na kawałki, które następnie są przypisane do różnych celów podrzędnych (zmiennych, odniesień do właściwości).

Aby napisać

a.b = anObj.first; 
a.c = anObj.second; 

z cesją destructuring byłoby użyć

({first: a.b, second: a.c}) = anObj; 

(nawiasy są konieczne w celu odróżnienia wyrażenia od bloku).

Jednak częstym przypadkiem użycia jest inicjalizacja zmiennych. Można skrócić

let b = anObj.first, 
    c = anObj.second; 

do

let {first: b, second: c} = anObj; 

a także nie jest skrótem, gdy zmienna ma taką samą nazwę jak własność, więc

let first = anObj.first, 
    second = anObj.second; 

jest równoważna

let {first, second} = anObj; 

Czy poprawne jest ustawienie let a = { first : a, second : b } = anObj;?

Nie, to nie ma większego sensu. Byłoby desugar do

let a; 
a = anObj.first; 
b = anObj.second; 
a = anObj; 
+0

Wspaniała odpowiedź, która usuwa zamieszanie w mojej głowie i tworzy całą masę pytań o nawiasy klamrowe w mojej głowie :) Dzięki @Bergi – Kayote

0

to dla destructuring:

var obj = {a: 1, b: 2}, 
    add = ({a, b}) => a + b; 

console.log(add(obj)); //3 

Więc w zasadzie do sprawozdania wewnątrz funkcji wydaje istnieją 2 argumenty, ale kiedy to nazwać tylko przekazać obiekt.

+0

Dzięki za odpowiedź, jednak nie odpowiada na pytanie/s. Próbuję zrozumieć kontekst i to, co się dzieje podczas niszczenia. – Kayote

Powiązane problemy