ES6: Parámetros REST en Javascript
Tags: javascript, webdev, spanish, es6
Published: 2020-07-25 14:27:29


## **¿Qué es un parámetro de tipo REST?**
Los parámetros de tipo REST son una nueva funcionalidad añadida al lenguaje en la especificación ES6. Se aplican en funciones (tradicionales o anónimas) y permite recibir n número de parámetros.

## **Sintaxis**

```javascript
function test(a,b, ...c){
//cuerpo de la función
}
// ...c es un parámetro de tipo REST
```
> *Los 3 puntos suspensivos dentro de la zona de parámetros de una función indican un parámetro de tipo REST*

> `c` es un arreglo, por ende podemos usar cualquier método útil para arreglos: `map()`, `filter()`, `reduce()`, etc.

Como siempre todo esto se comprende mejor con ejemplos prácticos:

Imaginemos que queremos hacer una función que nos sume 2 números, se vería más o menos así:

```javascript
let sumar = (a,b) => a+b;
console.log(sumar(5,6))
//salida: 11
```

Ahora como podríamos modificar nuestra función `sumar()` para que podamos sumar cualquier cantidad de números y no solo limitarnos a 2, para ello, podemos usar un parámetro de tipo REST de la siguiente manera:

```javascript
let sumar = (...numeros) => numeros.reduce((a,b) => a+b);
console.log(sumar(5,6,9)) //20
console.log(sumar(5,6,9,12)) //32
console.log(sumar(5,6)) //11
```

> *`numeros` es un arreglo.*

Usando un parámetro de tipo REST y el método `reduce()` podemos llegar a sumar n numeros usando nuestra función.

Ahora imaginemos que necesitamos crear una función que determine cuál es el mínimo numero de una lista

```javascript
function max(...numeros){
  let max = numeros[0];
  for(let i=1; i<= numeros.length; i++){
    if(numeros[i]>max){
      max = numeros[i];
    }
  }
  return max;
}
console.log(max(5,9,3));// 9
console.log(max(10,20,30));// 30
console.log(max(5,8,10,100,-1,8,70,50,1598,-9,50,71)); //1598
console.log(max(5));// 5
console.log(max());// undefined
```
Como pueden ver funciona muy bien, pero tenemos un pequeño problema cuando llamamos a la función sin parámetros, para solucionar esto podemos hacer una pequeña validación:

```javascript
function max(...numeros){
  if(!numeros.length){
    return("Necesita poner parametros")
  }
  let max = numeros[0];
  for(let i=1; i<= numeros.length; i++){
    if(numeros[i]>max){
      max = numeros[i];
    }
  }
  return max;
}
console.log(max());// "Necesita poner parametros"
```
Teniendo en cuenta que javascript soporta parámetros por defecto podríamos mejorar nuestro ejemplo:

```javascript
function max(max = 0 ,...numeros){
  for(let i=0; i<= numeros.length; i++){
    if(numeros[i]>max){
      max = numeros[i];
    }
  }
  return max;
}
console.log(max(5,9,3));// 9
console.log(max(10,20,30));// 30
console.log(max(5,8,10,100,-1,8,70,50,1598,-9,50,71)); //1598
console.log(max(5));// 5
console.log(max());// 0
```
Un detalle a tomar en cuenta es que los parámetros REST deben incluirse al final, por ejemplo, si hiciera lo siguiente, tendría un error: 

```javascript
//incorrecto
function max(...numeros, max = 0 ){
//cuerpo de la función
}

//correcto
function max(max = 0 , ...numeros){
//cuerpo de la función
}
```

## **Referencias** 👌
* https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Funciones/parametros_rest
* https://desarrolloweb.com/articulos/operador-rest-javascript-es6.html

---

## **Conclusiones** ✅
* Los parámetros REST permiten incorporar n parámetros a nuestras funciones.
* Los parámetros REST son arreglos, por ende, podemos usar varios métodos disponibles para su manipulación.
* El orden de los parámetros importa. 

![gif](https://media.giphy.com/media/l1Lc1Kn9hImgpx5Re/giphy.gif)