Che cos’è SpreadElement nella documentazione di ECMAScript? È uguale all’operatore Spread di MDN?

Alla specifica ECMAScript viene descritto SpreadElement

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

È uguale Spread operator

L’operatore di spread consente di espandere un’espressione in punti in cui sono previsti più argomenti (per chiamate di funzione) o più elementi (per letterali di array) o più variabili (per l’assegnazione destrutturante).

Sintassi

Per chiamate di funzione:

     myFunction(...iterableObj); 

    Per i letterali di matrice:

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

    descritto nella documentazione MDN ?

    Quali sono i casi d’uso di SpreadElement e, o, Spread operator di SpreadElement ; e se l’ Spread operator SpreadElement e Spread operator sono diversi, in quali modi specifici differiscono?

    Il termine “operatore di spread” è una sorta di “termine ombrello” che si riferisce a vari costrutti sintattici in ES6 che sembrano tutti ...x . MDN fa lo stesso.

    Tuttavia, questo è fuorviante, perché ... non è un operatore (almeno non nel senso in cui la specifica ECMAScript usa il termine “operatore”). Non genera un valore che può essere utilizzato in ulteriori calcoli. Preferirei confrontarlo con altri puntatori, come , o ; (che sono anche di tipo correlato ma hanno un significato diverso in contesti diversi).

    Il termine “operatore di spread” potrebbe riferirsi a:

    • Spread element, var arr = [a, b, ...c]; : L’elemento di diffusione espande il iterable ( c ) nel nuovo array. È equivalente a qualcosa come [a,b].concat(c) .

    • Elemento di rest, [a, b, ...c] = arr; : All’interno della destrutturazione, il ... costrutto ha l’effetto opposto: raccoglie gli elementi rimanenti in un array. L’esempio qui è equivalente a

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

      (nota che questa è solo un’approssimazione, perché la destrutturazione funziona su qualsiasi valore iterabile, non solo sugli array)

    • fun(a, b, ...c) : questo costrutto in realtà non ha un nome nelle specifiche . Ma funziona in modo molto simile come fanno gli elementi di diffusione: espande un iterabile nella lista degli argomenti.
      Sarebbe equivalente a func.apply(null, [a, b].concat(c)) .

      La mancanza di un nome ufficiale potrebbe essere il motivo per cui le persone hanno iniziato a utilizzare “operatore di spread”. Probabilmente lo chiamerei “argomento diffuso”.

    • Parametro Rest: function foo(a, b, ...c) : Simile agli elementi rest, il parametro rest raccoglie gli argomenti rimanenti passati alla funzione e li rende disponibili come array in c . La specifica ES2015 utilizza il termine BindingRestElement per fare riferimento a questo costrutto.

    Domande correlate:

    • Spread operator vs Rest parameter in ES2015 / es6
    • Usando l’operatore di spread più volte in javascript?

    : Se siamo molto pedanti dovremmo anche distinguere tra una dichiarazione di variabile ( var [a, b, ...c] = d; ) e un semplice assegnamento ( [a, b, ...c] = d; ), secondo le specifiche.

    SpreadElement è solo un nome nella grammatica ES6 per “operatore” di diffusione insieme al suo argomento quando in un letterale di Array:

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

    Quindi, SpreadElement in [a, b, ...c] è ...c ; spread “operator” è ... (spaventa le virgolette perché non è un vero operatore nello stesso senso che, ad esempio - è.)

    Il nome della regola di grammatica utilizzata nelle chiamate alle funzioni sarà diverso, poiché si tratta di un contesto grammaticale diverso (è solo un tipo di ArgumentList ).