Que font les accolades dans les instructions `var {…} =…`?

117

Je ne sais pas s'il s'agit d'une syntaxe JS spécifique à Mozilla, mais j'ai souvent trouvé des variables déclarées de cette façon, par exemple, dans la documentation du SDK complémentaire :

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

et dans divers Javascript chrome ( letinstruction est utilisée à la place de var),

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

J'ai trouvé cela très déroutant mais je ne peux pas trouver de documentation sur les deux syntaxes, même sur MDN .

timdream
la source
@Blender Comment rechercheriez-vous cette structure sur symbolhound.com?
trusktr
1
@trusktr: Un peu tard: symbolhound.com/…
Blender
La réponse courte est ici: stackoverflow.com/a/45909752/203704
Cliff Hall
Je suis d'accord avec la déconstruction de base. Cependant, dans cet exemple, nous attribuons également la valeur à un nom de propriété différent et cette syntaxe est très très confuse. C'est le contraire de la syntaxe de création d'objet et cela ajoute encore plus de confusion.
Sol

Réponses:

72

Ce sont deux fonctionnalités JavaScript 1.7. La première concerne les variables de niveau bloc :

letvous permet de déclarer des variables, en limitant sa portée au bloc, à l'instruction ou à l'expression sur lequel elle est utilisée. Ceci est différent du varmot - clé, qui définit une variable globalement, ou localement à une fonction entière quelle que soit la portée du bloc.

Le second s'appelle la déstructuration :

L'affectation de déstructuration permet d'extraire des données de tableaux ou d'objets à l'aide d'une syntaxe qui reflète la construction de tableaux et d'objets littéraux.
...
Une chose particulièrement utile que vous pouvez faire avec une affectation de déstructuration est de lire une structure entière dans une seule instruction, bien qu'il y ait un certain nombre de choses intéressantes que vous pouvez faire avec elles, comme indiqué dans la section pleine d'exemples qui suit.

Pour ceux qui connaissent Python, c'est similaire à cette syntaxe:

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

Le premier bloc de code est un raccourci pour:

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

Vous pouvez réécrire le deuxième bloc de code comme suit:

let Cc = Components.classes;
let Ci = Components.interfaces;
let Cr = Components.results;
let Cu = Components.utils;
Mixeur
la source
2
D'après mon expérience, ressemble à var { Hotkey }est équivalent à var { Hotkey: Hotkey }. Merci d'avoir localisé la documentation!
timdream
@timdream: J'avais le sentiment que c'était quelque chose comme ça, mais en quoi cela diffère- var Hotkey = require(...).Hotkeyt-il? Ou s'agit-il simplement d'enregistrer les frappes au clavier?
Blender
ressemble à ceci: - / (hehehe, ces programmeurs paresseux ...)
timdream
2
De plus, cela rend tout plus cryptique d'utiliser une syntaxe aussi rare.
trusktr
Le second est "Object Destructuring", référez-vous à developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
IcyBrk
80

Ce que vous regardez est une mission de déstructuration. C'est une forme de correspondance de motifs comme dans Haskell.

À l'aide de l'affectation de déstructuration, vous pouvez extraire des valeurs d'objets et de tableaux et les affecter à des variables nouvellement déclarées à l'aide de la syntaxe littérale d'objet et de tableau. Cela rend le code beaucoup plus succinct.

Par exemple:

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

var {a, b, c} = ascii;

Le code ci-dessus est équivalent à:

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

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

De même pour les tableaux:

var ascii = [97, 98, 99];

var [a, b, c] = ascii;

Cela équivaut à:

var ascii = [97, 98, 99];

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

Vous pouvez également extraire et renommer une propriété d'objet comme suit:

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

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

Cela équivaut à:

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

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

C'est tout ce qu'on peut en dire.

Aadit M Shah
la source
12
+1 pour les exemples de déstructuration d'objets, ils sont vraiment utiles. Les exemples MDN montrent uniquement la déstructuration des tableaux.
Blender
@Blender - Ils fournissent des exemples de déstructuration d'objets. Regardez Bouclage sur des valeurs dans un tableau d'objets .
Aadit M Shah
Je voulais dire la var {a, b, c} = ascii;syntaxe.
Blender
Ce dernier exemple est vraiment étrange car normalement ce qui est à gauche du colon est ce qui est attribué.
Curtis
1

Il s'agit d'une mission destructrice en Javascript et fait partie de la norme ES2015. Il décompresse ou extrait les valeurs des tableaux ou des propriétés des objets en variables distinctes. Par exemple: Destructuration de matrice

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

// avec déstructuration var [un, deux, trois] = foo

Par exemple: Destructuration d'objets

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

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

// Assigne de nouveaux noms de variables var {p: foo, q: bar} = o;

console.log (toto); // 42 console.log (barre); // vrai

Deeksha Sharma
la source
0

Il existe une documentation pour la letdéclaration sur MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

letest similaire à varen ce qu'il limite la portée de la variable déclarée. Il vous permet de déclarer une variable à l'intérieur d'un if(){}bloc (ou d'un autre bloc) et d'avoir cette variable uniquement "visible" à l'intérieur de ce bloc (JavaScript, jusqu'à présent, a une portée de fonction et non une portée de bloc comme la plupart des autres langages). Il lets'agit donc essentiellement d'une "solution" pour quelque chose avec lequel beaucoup de gens ont des problèmes. Notez que tihs est une fonctionnalité de JavaScript 1.7.

Je n'ai rien trouvé sur {Foo}.

Jan Hančič
la source
Désolé, je pensais que vous posiez des questions sur les deux ... Mon google-fu échoue quand il s'agit de {Foo}: /
Jan Hančič
Moi aussi: - / Google n'indexe pas {et }.
timdream