¿Qué es SpreadElement en la documentación de ECMAScript? ¿Es lo mismo que la sintaxis Spread en MDN?
En la especificación ECMAScript se SpreadElement
describe
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 SpreadElement
y, o, sintaxis extendida? y si SpreadElement
la sintaxis y la distribución son diferentes, ¿en qué formas específicas difieren?
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 extendido
var 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 aa = 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 afunc.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érminoBindingRestElement
para 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.
SpreadElement
es 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, SpreadElement
en [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
).