web-dev-qa-db-fra.com

Qu'est-ce que SpreadElement dans la documentation ECMAScript? Est-ce la même chose que la syntaxe Spread chez MDN?

Dans spécification ECMAScript le SpreadElement est décrit

SpreadElement[Yield]:
...AssignmentExpression[In, ?Yield]

Est-ce la même chose que la syntaxe Spread

La syntaxe Spread permet de développer une expression comme une expression de tableau ou une chaîne à des emplacements où zéro ou plusieurs arguments (pour les appels de fonction) ou des éléments (pour les littéraux de tableau) sont attendus, ou une expression d'objet à développer à des emplacements où zéro ou plus des paires clé-valeur (pour les littéraux d'objet) sont attendues.

Syntaxe

Pour les appels de fonction:

myFunction(...iterableObj);

Pour les littéraux de tableau:

[...iterableObj, 4, 5, 6]

décrit à MDN documentation? 

Quels sont les cas d'utilisation de la syntaxe SpreadElement et, ou, spread? et si SpreadElement et spread syntax sont différents, en quelles manières spécifiques diffèrent-ils?

36
guest271314

Le terme "opérateur de propagation" est en quelque sorte un "terme générique" qui fait référence à diverses constructions syntaxiques dans ES6 qui ressemblent toutes à ...x. MDN fait la même chose.

Cependant, ceci est trompeur, car ... n'est pas un opérateur (du moins pas dans le sens où la spécification ECMAScript utilise le terme "opérateur"). Il ne s'agit pas de générer une valeur qui puisse être utilisée dans des calculs ultérieurs. Je préférerais le comparer à d'autres ponctuateurs, tels que , ou ; (qui sont également liés, mais ont une signification différente dans un contexte différent).

Le terme "opérateur de propagation" pourrait faire référence à:

  • Elément Spread, var arr = [a, b, ...c]; : L'élément spread développe l'itérable (c) dans le nouveau tableau. Cela équivaut à quelque chose comme [a,b].concat(c).

  • Élément de repos, [a, b, ...c] = arr;: Dans la déstructuration, la construction ... a l'effet inverse: elle collecte éléments restants dans un tableau. L'exemple ici est équivalent à

    a = arr[0];
    b = arr[1];
    c = arr.slice(2);
    

    (notez qu'il ne s'agit que d'une approximation, car la déstructuration fonctionne sur toutes les valeurs itérables, pas seulement sur les tableaux)

  • fun(a, b, ...c): cette construction n'a pas de nom dans la spécification . Mais cela fonctionne de la même manière que les éléments spreads: cela étend un itérable dans la liste des arguments.
    Cela équivaudrait à func.apply(null, [a, b].concat(c)).

    L'absence d'un nom officiel pourrait être la raison pour laquelle les gens ont commencé à utiliser "propagation opérateur". J'appellerais probablement cela "l'argument de propagation".

  • Paramètre rest: function foo(a, b, ...c) : Comme pour les éléments rest, le paramètre rest collecte les arguments restants transmis à la fonction et les rend disponibles sous forme de tableau dans c. En fait, la spécification ES2015 utilise le terme BindingRestElement pour faire référence à cette construction.

Questions connexes:


: Si nous sommes très pédant, nous devrions même faire la distinction entre une déclaration de variable (var [a, b, ...c] = d;) et une affectation simple ([a, b, ...c] = d;), en fonction de la spécification.

79
Felix Kling

SpreadElement est juste un nom dans la grammaire ES6 pour propagation "opérateur" ainsi que son argument dans un littéral Array:

SpreadElement[Yield]:
    ... AssignmentExpression[In, ?Yield]

Donc, SpreadElement dans [a, b, ...c] est ...c; spread "opérateur" est .... (Scare Quotes car ce n’est pas un opérateur réel au sens où, par exemple, - est.)

Le nom de la règle de grammaire utilisée dans les appels de fonction sera différent, car il s'agit d'un contexte grammatical différent (il ne s'agit que d'un type de ArgumentList).

0
Amadan