5

Destructuring_assignment#Assignment_without_declarationQual è la differenza tra `{}` e `()` in questo codice?

dice:

il {a, b} sul lato sinistro è considerato un blocco e non un oggetto letterale.

var a, b; 
{a, b} = {a:1, b:2};//Syntax Error! 
({a, b} = {a:1, b:2}); // it works 

ciò che il '()' fare nella seconda frase?

perché il '{}' in esso è considerato un oggetto letterale?

+0

parentesi possono contenere solo espressioni: blocchi sono dichiarazioni * *, ma letterali oggetto o assegnazione di variabile sono espressioni * *. – gcampbell

risposta

2

dichiarazioni non devono iniziare con bretelle in Javascript: Pitfalls of destructuring

In alternativa, la seguente espressione è possibile:

"",{a, b} = {a:1, b:2}; 

E 'importante solo che una dichiarazione non inizia con una doppietta, perché il codice i blocchi iniziano con uno.

+0

** Le istruzioni non devono iniziare con parentesi graffe ** - questo non è giusto. puoi eseguire, ad esempio {} (a = 'test') e funziona perfettamente. –

+0

Sì. È a posto adesso. –

+0

Il commento di Andrii è sbagliato. '{} ({a, b} = {a: 1, b: 2});' può essere interpretato come un oggetto letterale vuoto o come un blocco vuoto (ciascuno seguito da un'espressione di assegnazione destrutturante). A causa dell'ASI (Inserimento automatico punto e virgola) questa riga viene convertita in: '{}; ({a, b} = {a: 1, b: 2}); '. Questo è tutto. Poiché né un oggetto letterale né un blocco vuoto stesso è un'istruzione, il codice è valido. – ftor

1

Il primo tenta di assegnare un valore a un blocco, che non è corretto. Il secondo è un equivalente

{}({a, b} = {a:1, b:2}); 

Così qui si sta chiamando un costruttore, fornendo il blocco delle proprietà e ad assegnare loro valori.

1

può semplicemente citare la spiegazione hilighted proprio accanto al campione aver collegato:

Penso che sia abbastanza chiaro

La sintassi (..) intorno l'istruzione di assegnazione è necessaria quando si utilizza assegnazione destrutturante letterale dell'oggetto senza una dichiarazione.

{a, b} = {a:1, b:2} non è una sintassi autonoma valida, poiché lo {a, b} sul lato sinistro è considerato un blocco e non un oggetto letterale.

Tuttavia, ({a, b} = {a:1, b:2}) è valido, come è var {a, b} = {a:1, b:2}

0

Non possiamo assegnare qualsiasi valore a qualsiasi letterali come matrice, oggetto, stringa.

ex: [a] = [1];

{a} = {1};

"a" = "b";

Ma possiamo assegnare valore utilizzando separatore virgola

[a], {a} = {a: 1};

uscita:

[a] - [1]

{a} - {a: 1}

Nota:

1.Object letterale non dovrebbe essere il primo nell'inizializzazione.

2.In letterale stringa non memorizza alcun valore.

() - è Qualto ritorno dichiarazione

Qualunque cosa dato in {}, si eseguirà automaticamente se stessa;

Per controllare è sufficiente posizionare il codice {return;} in qualsiasi punto della funzione restituirà la funzione.

Basta guardare nel codice tagliato per la comprensione.

var a =5;b=6; 
 
console.log(JSON.stringify({a,b})); 
 
//Output: {"a":5,"b":6} 
 

 
[a,b],{a,b} = {"a":1, "b":2}; 
 
console.log(JSON.stringify([a,b])); 
 
console.log(JSON.stringify({a,b})); 
 
//Output: 
 
//[1,2] 
 
//{"a":1,"b":2} 
 

 
var name = (function(){return "lotus"}); 
 
console.log(name); 
 
//Output: function(){return "lotus"} 
 

 
name = (function(){return "lotus"})(); 
 
console.log(name); 
 
//Output: lotus 
 

 
name = ({a, b} = {a:3, b:4}); 
 
console.log(JSON.stringify(name)); 
 
//Output: {"a":3,"b":4}

Problemi correlati