O que é o SpreadElement na documentação do ECMAScript? É o mesmo que o operador Spread no MDN?

Na especificação do ECMAScript, o SpreadElement é descrito

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

É o mesmo que o Spread operator

O operador spread permite que uma expressão seja expandida em locais onde vários argumentos (para chamadas de function) ou vários elementos (para literais de matriz) ou múltiplas variables ​​(para atribuição de desestruturação) são esperados.

Sintaxe

Para chamadas de function:

 myFunction(...iterableObj); 

Para literais de matriz:

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

descrito na documentação do MDN ?

Quais são os casos de uso do SpreadElement e, ou, o Spread operator ; e se o Spread operator SpreadElement e Spread operator forem diferentes, em quais maneiras específicas eles diferem?

O termo “operador de propagação” é uma espécie de “termo guarda-chuva” que se refere a várias construções sintáticas no ES6, todas parecidas com ...x . MDN faz o mesmo.

No entanto, isso é equivocado, porque ... não é um operador (pelo menos não no sentido em que a especificação ECMAScript usa o termo “operador”). Não gera um valor que possa ser usado em outros cálculos. Eu prefiro compará-lo a outros pontuadores, como ou ; (que também são relacionados, mas têm diferentes significados em diferentes contextos).

O termo “operador de spread” pode se referir a:

  • Elemento de propagação, var arr = [a, b, ...c]; : O elemento spread expande o iterável ( c ) para o novo array. É equivalente a algo como [a,b].concat(c) .

  • Elemento de descanso, [a, b, ...c] = arr; : Dentro da desestruturação, a ... construção tem o efeito oposto: ela coleta os elementos restantes em uma matriz. O exemplo aqui é equivalente a

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

    (note que isso é apenas uma aproximação, porque a desestruturação funciona em qualquer valor iterável, não apenas nos arrays)

  • fun(a, b, ...c) : Esta construção não tem realmente um nome na especificação . Mas funciona de maneira muito semelhante à dos elementos de propagação: expande um iterável na lista de argumentos.
    Seria equivalente a func.apply(null, [a, b].concat(c)) .

    A falta de um nome oficial pode ser a razão pela qual as pessoas começaram a usar o “operador de spread”. Eu provavelmente chamaria isso de “argumento de propagação”.

  • Parâmetro de descanso: function foo(a, b, ...c) : Similar a rest elements, o parâmetro rest coleta os argumentos restantes passados ​​para a function e os torna disponíveis como array em c . O ES2015, na verdade, usa o termo BindingRestElement para se referir a essa construção.

Perguntas relacionadas:

  • Operador de spread versus parâmetro de descanso no ES2015 / es6
  • Usando o operador de propagação várias vezes em javascript?

: Se formos muito pedantes, teremos que distinguir entre uma declaração de variável ( var [a, b, ...c] = d; ) e atribuição simples ( [a, b, ...c] = d; ), de acordo com as especificações.

SpreadElement é apenas um nome na gramática ES6 para spread “operator” junto com seu argumento quando em um literal de array:

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

Então, SpreadElement em [a, b, ...c] é ...c ; spread “operador” é ... (aspas de susto porque não é um operador real no mesmo sentido que, por exemplo, é.)

O nome da regra gramatical usada nas chamadas de function será diferente, pois é um contexto gramatical diferente (é apenas um tipo de ArgumentList ).