Parametros REST y operador SPREAD

Los parametros REST y el operador SPREAD son características desarrolladas a partir del estándar de ECMASCRIPT 6. A primera vista parecierán similares, pero veremos que en la practica son lo contrario el uno del otro.

El parámetro REST

Esta característica   permite a una función recibir uno o n cantidad de parametros e incluso cero. Es importante mencionar que dicho parámetro  siempre retornara un array con los parámetros enviados. Para definir un parámetro REST es necesario anteponer   ...   al nombre del parámetro.


function salida(...params){
  let msg = '';
  for (let param of params) msg += param;
  return msg;
}
alert( salida('Hola','!!!') );//Hola!!

En el código anterior hacemos el  llamado de la función  salida()  enviando dos parámetros,  dicha función es declarada con un parámetro REST.

También es válido mezclar parámetros    comunes con parámetros REST...


function salida(param1,...params){
  let msg = param1;
  for (let param of params) msg += param;
  return msg;
}
alert( salida('Hola','!!!',' ','Saludos') );//Hola!! Saludos

Los parámetros Rest reúnen el resto de parámetros enviados a una función declarada con una cantidad de n parámetros. Por lo que el siguiente ejemplo no tiene sentido y arrojará un error


function salida(param1,...params, param2){
  let msg = param1;
  for (let param of params) msg += param;
  return msg;
}
alert( salida('Hola','!!!',' ','Saludos') );//error


SPREAD operator

El operador spread toma un array  y lo convierte en una lista de parámetros,  justo lo contrario del parámetro REST. Supongamos que tenemos un array de números y necesitamos saber el valor máximo de ellos; Utilizando el método estático de la clase Math lo podríamos hacer solo que este método no soporta arrays... Entonces empleamos  el operador SPREAD.


const nums =[1,2,3];

//Esto generará un error
let max = Math.max( nums );

//empleando spread operator
let max = Math.max( ...nums );

//Lo que hace spread por detras
let max = Math.max( 1, 2, 3 );

Otro ejemplo de aplicación sencillo para este operador es la del clonado de un array u objeto en otro, copiando o clonando únicamente el contenido y no su referencia. 


let arr = [1,2,3];
//guardamos el contenido de array en una copia
let aCopy = [ ...arr ];

//Si ahora modificamos nuestra variable array...
arr.push(4);

//el cambio solo se aplicará a la variable arr
//ya que arr y aCopy coparten el mismo contenido
//pero no su referencia
console.log( arr );   // 1,2,3,4
console.log( aCopy ); // 1,2,3