¿Qué es SpreadElement en la documentación de ECMAScript? ¿Es lo mismo que la sintaxis Spread en MDN?

Resuelto guest271314 asked hace 8 años • 4 respuestas

En la especificación ECMAScript se SpreadElementdescribe

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

¿Es esto lo mismo que la sintaxis Spread ?

La sintaxis extendida permite que un iterable, como una expresión de matriz o una cadena, se expanda en lugares donde se esperan cero o más argumentos (para llamadas a funciones) o elementos (para literales de matriz), o que se expanda una expresión de objeto en lugares donde cero o más Se esperan pares clave-valor (para literales de objetos).

Sintaxis

Para llamadas a funciones:

myFunction(...iterableObj);

Para literales de matriz:

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

descrito en la documentación de MDN ?

¿Cuáles son los casos de uso de SpreadElementy, o, sintaxis extendida? y si SpreadElementla sintaxis y la distribución son diferentes, ¿en qué formas específicas difieren?

guest271314 avatar May 11 '16 09:05 guest271314
Aceptado

El término "operador de extensión" es una especie de "término general" que se refiere a varias construcciones sintácticas en ES6 que se parecen a ...x. MDN hace lo mismo.

Sin embargo, esto es engañoso, porque ...no es un operador (al menos no en el sentido en que la especificación ECMAScript usa el término "operador"). No genera un valor que pueda usarse en cálculos adicionales. Prefiero compararlo con otros puntuadores, como ,o ;(que también están relacionados pero tienen un significado diferente en un contexto diferente).

El término "operador de diferencial" podría referirse a:

  • Elemento extendidovar arr = [a, b, ...c]; : El elemento extendido expande el iterable (c) en la nueva matriz. Es equivalente a algo como[a,b].concat(c).

  • Elemento de descanso, [a, b, ...c] = arr; : dentro de la desestructuración, la...construcción tiene el efecto opuesto: recopila los elementos restantes en una matriz. El ejemplo aquí es equivalente a

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

    (tenga en cuenta que esto es solo una aproximación, porque la desestructuración funciona con cualquier valor iterable, no solo con matrices)

  • fun(a, b, ...c): esta construcción en realidad no tiene un nombre en la especificación . Pero funciona de manera muy similar a como lo hacen los elementos extendidos: expande un iterable en la lista de argumentos.
    Sería equivalente a func.apply(null, [a, b].concat(c)).

    La falta de un nombre oficial podría ser la razón por la que la gente empezó a utilizar "operador de difusión". Probablemente lo llamaría "argumento extendido".

  • Parámetro rest:function foo(a, b, ...c) similar a los elementos rest, el parámetro rest recopila los argumentos restantes pasados ​​a la función y los pone a disposición como una matriz enc. La especificación ES2015 en realidad usa el términoBindingRestElementpara referirse a esta construcción.

Preguntas relacionadas:

  • Operador de extensión vs parámetro Rest en ES2015/es6
  • ¿Utiliza el operador de extensión varias veces en javascript?

: Si somos muy pedantes incluso tendríamos que distinguir entre declaración de variable ( var [a, b, ...c] = d;) y asignación simple ( [a, b, ...c] = d;), según la especificación.

Felix Kling avatar May 11 '2016 03:05 Felix Kling

SpreadElementes solo un nombre en la gramática de ES6 para el "operador" extendido junto con su argumento cuando está en un literal de matriz:

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

Entonces, SpreadElementen [a, b, ...c]es ...c; El "operador" de extensión es .... (comillas de miedo porque no es un operador real en el mismo sentido que, por ejemplo, lo -es).

El nombre de la regla gramatical que se utiliza en las llamadas a funciones será diferente, ya que es un contexto gramatical diferente (es solo un tipo de ArgumentList).

Amadan avatar May 11 '2016 02:05 Amadan