javascript - es6 - rest operator
¿Qué es SpreadElement en la documentación de ECMAScript? ¿Es lo mismo que la sintaxis Spread en MDN? (2)
En la
especificación ECMAScript
se describe el
SpreadElement
SpreadElement[Yield]:
...AssignmentExpression[In, ?Yield]
¿Es esto lo mismo que la sintaxis Spread
La sintaxis extendida permite que una iteración como una expresión de matriz o cadena se expanda en lugares donde se esperan cero o más argumentos (para llamadas a funciones) o elementos (para literales de matriz), o una expresión de objeto para expandirse en lugares donde cero o más se esperan pares clave-valor (para literales de objeto).
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 de propagación;
y si
SpreadElement
y spread syntax son diferentes, ¿en qué maneras específicas difieren?
El término "operador de propagació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 erróneo, 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 posteriores.
Prefiero compararlo con otros signos de puntuación, como o
;
(que también están relacionados, pero tienen un significado diferente en un contexto diferente).
El término "operador de propagación" podría referirse a:
-
Elemento extendido,
var arr = [a, b, ...c];
: El elemento spread 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 contrario: recoge 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 en cualquier valor iterable, no solo en 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 de propagación: 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 cual la gente comenzó a usar "operador de propagación". Probablemente lo llamaría "argumento extendido".
-
Parámetro rest :
function foo(a, b, ...c)
: similar a los elementos rest, el parámetro rest recoge los argumentos restantes pasados a la función y los pone a disposición como matriz enc
. La especificación ES2015 realmente usa el términoBindingRestElement
para referirse a esta construcción.
Preguntas relacionadas:
- Operador extendido vs parámetro de reposo en ES2015 / es6
- ¿Usando el operador spread varias veces en javascript?
†
: Si somos
muy
pedantes, incluso tendríamos que distinguir entre una declaración variable (
var [a, b, ...c] = d;
) y una asignación simple (
[a, b, ...c] = d;
), según la especificación.
SpreadElement
es solo un nombre en la gramática ES6 para "operador" extendido junto con su argumento en un literal Array:
SpreadElement[Yield]:
... AssignmentExpression[In, ?Yield]
Entonces,
SpreadElement
en
[a, b, ...c]
es
...c
;
propagación "operador" es
...
(comillas de miedo porque no es un operador real en el mismo sentido que, por ejemplo
-
es).
El nombre de la regla gramatical que se usa en las llamadas a funciones será diferente, ya que es un contexto gramatical diferente (es solo un tipo de
ArgumentList
).