En ES6, se introdujo un nuevo operador, que es: ...
Estos tres puntos seguidos, pueden cumplir dos funciones:
El rest parameter es la utilización de ...
para juntar a n
elementos en un array único.
Ahora bien, la definición roza lo inentendible, veamoslo con un ejemplo:
Imaginemos que tenemos la siguiente función:
function suma(x, y) {
return x + y;
}
suma(1, 2, 3, 4, 5) // devuelve 3 porque hace 1 + 2 y la función solamente espera dos argumentos: x e y
Utilizando ...
como rest parameter, podemos hacer lo siguiente:
function suma(...args) {
console.log(args);
// en el primer llamado es [1]
// en el segundo es [1, 2]
// en el tercero [1, 2, 3, 4, 5]
let result = 0;
args.forEach((arg) => {
result = result + arg;
});
return result;
}
//primer llamado
suma(1); // devuelve 1
//segundo llamado
suma(1, 2); // devuelve 3
//tercer llamado
suma(1, 2, 3, 4, 5); // devuelve 15
Esto significa que nosotros podemos transformar a los argumentos recibidos por la función, en un array de argumentos, y por lo tanto iterarlos con un forEach, map, reduce, o cualquier otro método de javascript para arrays.
El operador spread, nos permite expandir elementos. Con el rest parameter podíamos transformar una lista de argumentos en un array único, el spread operator nos permite transformar un array en elementos únicos.
Devuelta, miremos los ejemplos:
const arr = [4, 5, 6];
const newArr = [1, 2, 3, ...arr];
console.log(newArr) //esto devuelve [1, 2, 3, 4, 5, 6]
const arr = [1, 2, 3];
const arr2 = [...arr];
console.log(arr2) //esto devuelve [1, 2, 3]
function suma(a, b, c) {
return a + b + c ;
}
const args = [1, 2, 3];
suma(...args); //esto devuelve 6
//es lo mismo que hacer
suma(1, 2, 3)
const objeto = { name: "CourseIt" };
// si queremos agregar una nueva propiedad a nuestro objeto
//con el spread operator podemos hacer:
const nuevoObjeto = {
...objeto,
description: "El mejor lugar para aprender a programar"
};
console.log(nuevoObjeto)
//devuelve:
{
name: "CourseIt",
description: "El mejor lugar para aprender a programar"
};
//Supongamos que queremos modificar
//la description de nuevoObjeto, podemos hacer:
const nuevaDescription = {
...nuevoObjeto,
description: "Esto es una nueva descripción"
};
console.log(nuevaDescription)
//devuelve:
{
name: "CourseIt",
description: "Esto es una nueva descripción"
};
import { useState } from "react";
function App() {
//creamos un estado que es un objeto y va a guardar dos valores: name y lastName
const [state, setState] = useState({ name: "", lastName: "" });
function handleChange(e) {
//esta función lee el name y el value del input
const { name, value } = e.target;
//y con el spread operator mutamos la propiedad del objeto correspondiente,
// con su valor correspondiente
setState({ ...state, [name]: value });
}
return (
<div>
<input name="name" value={state.name} onChange={handleChange} />
<input name="lastName" value={state.lastName} onChange={handleChange} />
</div>
);
}
export default App;
...
es el spread operator o el rest parameter?La respuesta es: ambas. Dependiendo de cómo usemos ...
cómo debemos llamarlo. La realidad es que todo el mundo siempre habla del operador spread, aunque se utilice como parámetro rest o operador spread.
Espero que les sirva, y si tienen dudas me pueden preguntar por twitter en @ncastrogarcia o hablarme al discord de CourseIt
Eso es todo folks.