Parámetros Rest en ECMAScript 6

Ayer te estuve contando un nuevo operador llamado spread operator, u operador de propagación, que se utiliza para expandir los elementos que hay en un array. Hoy te quiero hablar de los parámetros Rest que, si bien parece lo mismo a nivel de sintaxis, hace justo lo contrario: contrae varios elementos dentro de un array 🙂

Una de las particularidades que tiene JavaScript es que no le importa el número de parámetros que pasas a una función, ya que los que no estén declarados en la misma se irán almacenando en un objecto llamado arguments.

function sum(a, b) {

    console.log(arguments); // [Arguments] { '0': 1, '1': 3, '2': 5, '3': 6 }
    console.log(sum.length); // 2

    var args = Array.prototype.slice.call(arguments, sum.length);

    console.log(args); // [ 5, 6 ]

    let result = 0;

    for (var i in args) result += args[i];

    return result + a + b;

}

console.log(sum(1, 3, 5, 6)); // 15

En el código anterior puedes ver que la función sum tiene declarados sólo dos parámetros, a y b. Sin embargo, en la última línea se está haciendo una llamada con cuatro. Dentro de sum he inspeccionado el valor del objeto arguments, el cual muestra todos los que tiene la función, tanto los declarados como los que no, y luego sum.length que te devuelve el número que tiene declarados. Para poder recuperar solamente aquellos que no están en la firma de la función utilizo la función slice del prototipo del Array. Itero sobre los que no están declarados y finalmente le sumo los declarados. Mucho lío para lo poco que quiero hacer ¿no?

Ahora con ECMAScript 6 podemos simplificarlo muchísimo utilizando los parámetros Rest:

function sum(a, b, ...rest) {
    let result = 0;
    for (var i in rest) result += rest[i];

    return result + a + b;
}

console.log(sum(1, 3, 5, 6)); // 15

¡Mucho más limpio que lo anterior! E incluso, en este caso que es una suma, podría ser más sencillo todavía, eliminando los parámetros declarados:

function sum(...rest) {
    let result = 0;
    for (var i in rest) result += rest[i];

    return result;
}

console.log(sum(1, 3, 5, 6)); // 15

Por último, es importante que sepas que los parámetros rest siempre deben ir al final de la declaración en la firma de la función, de lo contrario fallará.

Los parámetros rest siempre deben ir al final de la declaración de parámetros
Los parámetros rest siempre deben ir al final de la declaración de parámetros

¡Saludos!