Cosa fanno le parentesi graffe nelle istruzioni `var {…} = ...`?


117

Non sono sicuro che si tratti di una sintassi JS specifica di Mozilla, ma spesso ho trovato variabili dichiarate in questo modo, ad esempio, nei documenti SDK aggiuntivi :

var { Hotkey } = require("sdk/hotkeys");

e in vari JavaScript JavaScript ( letviene utilizzata l'istruzione al posto di var),

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu }  = Components;

L'ho trovato molto confuso ma non sono riuscito a trovare alcuna documentazione su entrambe le sintassi, nemmeno su MDN .


@Blender Come cercheresti questa struttura su symbolhound.com?
trusktr

1
@trusktr: Un po 'in ritardo: symbolhound.com/…
Blender


Sto bene con la decostruzione di base. Tuttavia, in questo esempio stiamo anche assegnando il valore a un nome di proprietà diverso e tale sintassi è molto molto confusa. È l'opposto della sintassi per la creazione di oggetti e questo aggiunge ancora più confusione.
Sol

Risposte:


72

Sono entrambe funzionalità di JavaScript 1.7. Il primo è le variabili a livello di blocco :

letconsente di dichiarare variabili, limitandone l'ambito al blocco, all'istruzione o all'espressione su cui viene utilizzato. Questo è diverso dalla varparola chiave, che definisce una variabile a livello globale o locale per un'intera funzione indipendentemente dall'ambito del blocco.

La seconda si chiama destrutturazione :

La destrutturazione dell'assegnazione rende possibile estrarre dati da array o oggetti utilizzando una sintassi che rispecchia la costruzione di array e letterali oggetto.
...
Una cosa particolarmente utile che puoi fare con l'assegnazione destrutturante è leggere un'intera struttura in una singola istruzione, sebbene ci siano un certo numero di cose interessanti che puoi fare con esse, come mostrato nella sezione piena di esempi che segue.

Per chi ha familiarità con Python, è simile a questa sintassi:

>>> a, (b, c) = (1, (2, 3))
>>> a, b, c
(1, 2, 3)

Il primo blocco di codice è un'abbreviazione per:

var {Hotkey: Hotkey} = require("sdk/hotkeys");
// Or
var Hotkey = require("sdk/hotkeys").Hotkey;

Puoi riscrivere il secondo blocco di codice come:

let Cc = Components.classes;
let Ci = Components.interfaces;
let Cr = Components.results;
let Cu = Components.utils;

2
Dal mio esperimento, sembra che var { Hotkey }sia equivalente a var { Hotkey: Hotkey }. Grazie per aver trovato la documentazione!
timdream

@timdream: avevo la sensazione che fosse qualcosa del genere, ma in che cosa differisce var Hotkey = require(...).Hotkey? O sta solo salvando i tasti premuti?
Blender

sembra così: - / (hehehe, questi pigri programmatori ...)
timdream

2
Inoltre rende tutto più criptico l'utilizzo di una sintassi così insolita.
trusktr

Il secondo è "Object Destructuring", fare riferimento a developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
IcyBrk

80

Quello che stai guardando è un compito destrutturante. È una forma di corrispondenza dei modelli come in Haskell.

Utilizzando l'assegnazione destrutturante è possibile estrarre valori da oggetti e array e assegnarli a variabili dichiarate di recente utilizzando la sintassi letterale dell'oggetto e dell'array. Questo rende il codice molto più succinto.

Per esempio:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a, b, c} = ascii;

Il codice sopra è equivalente a:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var a = ascii.a;
var b = ascii.b;
var c = ascii.c;

Allo stesso modo per gli array:

var ascii = [97, 98, 99];

var [a, b, c] = ascii;

Questo è equivalente a:

var ascii = [97, 98, 99];

var a = ascii[0];
var b = ascii[1];
var c = ascii[2];

È inoltre possibile estrarre e rinominare una proprietà dell'oggetto come segue:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a: A, b: B, c: C} = ascii;

Questo è equivalente a:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var A = ascii.a;
var B = ascii.b;
var C = ascii.c;

È tutto quello che c'è da fare.


12
+1 per gli esempi di destrutturazione degli oggetti, sono davvero utili. Gli esempi MDN mostrano solo la destrutturazione dell'array.
Blender

@ Blender - Forniscono esempi di destrutturazione degli oggetti. Guarda il loop tra i valori in una matrice di oggetti .
Aadit M Shah

Intendevo la var {a, b, c} = ascii;sintassi.
Blender

Quest'ultimo esempio è davvero strano perché normalmente ciò che è a sinistra dei due punti è ciò che viene assegnato.
Curtis

1

Questo è un compito distruttivo in Javascript e fa parte dello standard ES2015. Decomprime o estrae i valori da array o proprietà da oggetti in variabili distinte. Ad esempio: Array Destructuring

var foo = ["one", "two", "three"];
//without destructuring
var one = foo[0];
var two = foo[1];
var three = foo[2];

// con destrutturazione var [uno, due, tre] = pippo

Ad esempio: destrutturazione di oggetti

var o = {p: 42, q: true}; var {p, q} = o;

console.log (p); // 42 console.log (q); // vero

// Assegna nuovi nomi di variabili var {p: foo, q: bar} = o;

console.log (foo); // 42 console.log (bar); // vero


0

È disponibile la documentazione per la letdichiarazione su MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

letè simile a varin quanto limita l'ambito della variabile dichiarata. Ti permette di dichiarare una variabile all'interno di un if(){}blocco (o qualche altro blocco) e avere quella variabile solo "visibile" all'interno di quel blocco (JavaScript, fino ad ora, ha l'ambito della funzione e non l'ambito del blocco come la maggior parte degli altri linguaggi). Quindi letè fondamentalmente una "correzione" per qualcosa con cui molte persone hanno problemi. Tieni presente che tihs è una funzionalità di JavaScript 1.7.

Non ho trovato niente su {Foo}.


Scusa, pensavo che ti chiedessi di entrambi ... Il mio google-fu mi delude quando si tratta di {Foo}: /
Jan Hančič

Anch'io: - / Google non indicizza {e }.
timdream
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.