Operadores Spread e Rest Javascript

Capa do artigo

Através do bootcamp do qual sou aluna, aprendi sobre os operadores REST e SPREAD, ambas features do ES6.

Porém apareceu uma publicação em minha timeline do linkedin onde o autor falou um pouco do REST, e ao visualizar os comentários percebi que vários desenvolvedores pareciam ainda não conhecer essa maravilhosidade, e então resolvi escrever esse artigo para ajudarmos ainda mais desenvolvedores(as).

SPREAD

Basicamente o operador spread ... serve para que possamos copiar dados de um array ou objeto e para passarmos um array inteiro como parâmetro para uma função, porém quando a função não espera um array mas sim argumentos separados.

OMG parece genial não? Mas como utilizá-lo?

const dataUser = ['Michelle', 1964, '1,80m', 'Chicago'];

const newUser = [...dataUser, 'married', 'mom'];

console.log(dataUser); // (4) ['Michelle', 1964, '1,80m', 'Chicago']
console.log(newUser); // (6) ['Michelle', 1964, '1,80m', 'Chicago', 'married', 'mom']

Partindo do código acima, podemos observar que temos a variável dataUser que é um array com os dados de um usuário.

Suponhamos que queremos criar uma novo array newUser que possua os mesmos dados do dataUser, mais dados adicionais, então utilizamos o spread […nameArray, dadosAdicionais].

Então, dando um console.log em nossos 2 arrays, vemos que dataUser possui 4 posições e newUser possui 6, pois ele possui tudo de dataUser mais o estado civil e a cidade como dados adicionais.

Podemos também apenas copiar os dados do array ou objeto que queremos e colocá-los em uma nova variável, nada nos impede:

const dataUser = {
  name: 'Ilda',
  age: 23,
  office: 'desenvolvedora',
}

const newuser = { ...dataUser }

console.log(dataUser) // {name: 'Ilda', age: 23, office: 'desenvolvedora'}
console.log(newUser) // {name: 'Ilda', age: 23, office: 'desenvolvedora'}

Com isso, os objetos dataUser e newUser possuirão os mesmos conteúdos.

Outra forma de utilizarmos o spread é em funções, principalmente aquelas que requerem uma quantidade considerável de parâmetros. Utilizando o exemplo abaixo, nossa função sum() espera por três parâmetros, onde ela retornará a soma dos 3.

Se não tívessemos o spread, teríamos as duas opções abaixo para enviar parâmetros a nossa função, sendo a opção 2 a ‘pior’ forma digamos.

const data = [2, 8, 6]

function sum(x, y, z) {
  return x + y + z
}

sum(1, 2, 3) // Opção 1
sum(data[0], data[1], data[2]) // Opção 2

Com o spread precisaríamos apenas:

const data = [2, 8, 6]

function sum(x, y, z) {
  return x + y + z
}

console.log(sum(...data)) // 16

O que o spread faz no exemplo acima é “quebrar o array” onde cada posição se torna uma variável do argumento.

Podemos também combinar (um ou mais) arrays ou (um ou mais) objetos:

const firstName = ['Ilda']
const surname = ['Neta']
const fullName = [...firstName, ...surname]

console.log(fullName) // (2) ['Ilda', 'Neta'];

console.log(...fullName) // Ilda Neta

Perceba que no exemplo acima, utilizei o spread também no console.log, assim ele já mostra meu array fullName ‘espalhado’.

Rest

O rest é utilizado quando queremos recuperar o resto de conteúdos de objetos e vetores, permitindo que nós transformemos indeterminado número de parâmetros em um novo array.

Seguindo a linha do spread, o rest possui a mesma forma declarativa para utilização, …nomeArray ou …nomeObjeto, porém o rest é utilizado sempre no final e a forma de nomear as variáveis também é diferente, pois o rest utiliza o modelo de desestruturação.

Vamos aos exemplos:

const numbers = [1, 2, 3, 4, 5, 6, 7, 8]
const [um, dois, tres, quatro, ...restNumbers] = numbers

console.log(um) // 1
console.log(quatro) // 4
console.log(restNumbers) // (4) [5, 6, 7, 8]

Conforme acima, o array numbers possui números, porém se quisermos utilizar alguns números em variáveis separadas, basta criarmos um novo array passando o nome que essas variáveis passarão a ter e o restante dos dados que não quisermos em variáveis separadas, podemos transformá-los em outro array.

Nesse caso, o restNumbers é um array derivado de numbers que possui o restante dos números que não separamos.

const person = ['Michelle', 1964, '1,80m', 'Chicago', 'MIT']

const [name, yearBirthday, height, ...personData] = person

console.log(name) // Michelle
console.log(height) // 1,80m
console.log(personData) // (2) ['Chicago', 'MIT']

Os nomes que daremos as nossas variáveis devem seguir a ordem da posição dos itens do array, nesse caso, name equivale a posição[0] de person, assim como yearBirthday equivale a posição[1] e assim sucessivamente.

O rest também funciona com objetos, porém já é um processo de desestruturação diferente e acho que merece um artigo só para ele.

Espero que tenham conseguido entender o valor desses operadores em nosso dia a dia, pois são uma mão na roda.

E se você utiliza React por exemplo, o spread é muito valioso para setar valores em estados, já que o React parte do princípio da imutabilidade.

Um abraço e te espero no próximo artigo! 👋🏻