2012-05-10 9 views
11

Mentre si guarda a un certo codice Javascript per di Mozilla (Firefox) Add-on SDK, ho visto la dichiarazione tipo di variabili che non avevo mai visto prima:Javascript - Assegnazione di più variabili di opporsi proprietà utilizzando parentesi graffe in dichiarazione di variabili

var { foo, bar } = someFunction("whatever"); // just an example 

Vedere le parentesi graffe attorno al nome della variabile? Risulta, questo è un modo di assegnare i valori delle proprietà di un oggetto a più variabili tutte in una volta. Sembra simile a destructuring assignment o PHP list, ad eccezione delle proprietà dell'oggetto invece degli array.

In realtà ho trovato questo fuori attraverso alcuni giocherellando, poiché non sembra esserci alcuna documentazione su di esso. Date un'occhiata a questo codice:

function gimmeAnObject() { 
    return { 
     foo: "hey", 
     bar: "sup" 
    }; 
} 

console.log(gimmeAnObject()); // Object { foo="hey", bar="sup" } 

var { foo, bar } = gimmeAnObject(); 

console.log(foo); // hey 
console.log(bar); // sup 

Ho anche scoperto che funziona solo in Firefox. Chrome genererà invece un errore: "Uncaught SyntaxError: token imprevisto {". Questo spiega perché non l'avevo visto prima di iniziare a guardare il codice add-on di Firefox.

Qualcun altro ha mai visto questo tipo di dichiarazione delle variabili prima? Perché non riesco a trovare alcuna documentazione su di esso? Dal momento che funziona solo su Firefox, penso che potrebbe essere una cosa di Mozilla, ma non ho potuto trovare nulla su di esso su MDN. Poi di nuovo, forse non sapevo cosa cercare.

+0

possibile duplicato di [Dichiarazione costante con blocco] (http://stackoverflow.com/questions/10199229/constant-declaration-with-block) –

+1

Trovato questa domanda durante la composizione di una domanda quasi identica a me :) – Motti

risposta

5

Guardando collegamenti "destrutturazione assegnazione" (vale a dire http://en.wikipedia.org/wiki/JavaScript_syntax#Assignment e http://dailyjs.com/2011/09/12/destructuring/) sembra che questo costrutto è assegnazione destrutturazione.

Wikipedia:

In Mozilla's JavaScript, since version 1.7, destructuring assignment allows the assignment of parts of data structures to several variables at once. The left hand side of an assignment is a pattern that resembles an arbitrarily nested object/array literal containing l-lvalues at its leafs which are to receive the substructures of the assigned value.

In array e gli oggetti JavaScript sono più o meno uguali quindi non è molto sorprendente che costrutto supportato per array è supportato anche per oggetti.

+1

Huh, sembra che tu abbia ragione. Mi chiedo perché ci sia così poca documentazione su di esso, però. Immagino che nessuno tranne Mozilla abbia visto l'utilità del compito distruttivo. – grant

0

Non puoi farlo. Devi solo per citarne var e fare qualcosa del genere:

var myObj = (function(){ 
    return { 
     foo: 'foo', 
     bar: 'bar' 
    }; 
})(); 
+1

You Pensa di sì, sì, ma sembra in Firefox, puoi farlo. Prova a eseguire il link jsFiddle che ho postato su Firefox con una console aperta. – grant

+0

Forse Firefox è un po 'più permissivo, oppure ha una propria implementazione che lo consente. Ma immagino che questa dichiarazione non sia negli standard web –

+2

E 'stata aggiunta agli standard web. Aspetta qualche anno. ;) –