Usamos o rest parameters quando não sabemos a quantidade de argumentos (dai vem o nome de rest parameters) que vai receber uma função (isso o que chamamos de função variádica) quando ela for invocada. Ou seja, usamos o rest parameters na declaração de uma função (dai o nome de rest parameters) para indicar que a função pode receber uma quantidade variável de argumentos ao ser invocada.
O "spread operator" é muito parecido ao "rest parameters" já que ambos usam a mesma sintaxe dos três pontos, mas a diferença é que usamos o "spread operator" nas "invocações das funções" para espalhar os itens de um arreglo (o as propriedades de um objeto), no entanto, usamos o "rest parameters" nas declarações das funções para "colocar" dentro de um arreglo todos os argumentos que a invocação da função recebeu, independente de quantos argumentos sejam. Ou seja, quando declaramos uma função e não sabemos quantos argumentos ela vai receber quando seja invocada, podemos usar o "rest parameters" na declaração da função para colocar dentro de um array todos os argumentos que a função vai receber.
Segue exemplo onde usamos o rest parameters para declarar uma função que recebe uma quantidade variável de números como parâmetros e retorna a soma desses números. Neste exemplo também vamos usar o "spread operator":
const numbers2 = [50, 100];
const numbers3 = [50, 100, 200];
const numbers4 = [50, 100, 200, 250];
const sum = (...arr) => arr.reduce((acc, num) => acc + num, 0); //aqui estamos usando o rest parâmetros
console.log(sum(...numbers2)); // 150 //aqui estamos usando o spread operator
console.log(sum(...numbers3)); // 350
console.log(sum(...numbers4)); // 600
//Também na declaração de uma função podemos usar parámetros "normais" e rest parameters ao mesmo tempo. A seguir um exemplo:
const name = 'Peter';
const qualifications = [99, 100, 95];
const qualifications2 = [99, 100, 95, 97, 90];
const showQualifications = (userName, ...params) => { //aqui estamos usando o rest parameters
const sum = params.reduce((acc, num) => acc + num ,0);
return `${userName} sua media é: ${sum/params.length} `;
}
console.log(showQualifications(name, ...qualifications)); //Peter sua media é: 98 //aqui usamos o spread operator
console.log(showQualifications(name, ...qualifications2)); //Peter sua media é: 96.2
Uso de rest parameters na desestruturação de objetos (ou arreglos)
Como já sabemos, o rest parameters é usado na declaração de uma função, mas acontece que também podemos usar o rest parameters na desestruturação de um objeto (ou um arreglo também) para armazenar o restante das propriedades do objeto que estamos desestruturando dentro de um outro objeto (ou o restante dos itens de um arreglo dentro de um outro arreglo). A seguir um exemplo:
REST PARAMETERS
Usamos o rest parameters quando não sabemos a quantidade de argumentos (dai vem o nome de rest parameters) que vai receber uma função (isso o que chamamos de função variádica) quando ela for invocada. Ou seja, usamos o rest parameters na declaração de uma função (dai o nome de rest parameters) para indicar que a função pode receber uma quantidade variável de argumentos ao ser invocada.
O "spread operator" é muito parecido ao "rest parameters" já que ambos usam a mesma sintaxe dos três pontos, mas a diferença é que usamos o "spread operator" nas "invocações das funções" para espalhar os itens de um arreglo (o as propriedades de um objeto), no entanto, usamos o "rest parameters" nas declarações das funções para "colocar" dentro de um arreglo todos os argumentos que a invocação da função recebeu, independente de quantos argumentos sejam. Ou seja, quando declaramos uma função e não sabemos quantos argumentos ela vai receber quando seja invocada, podemos usar o "rest parameters" na declaração da função para colocar dentro de um array todos os argumentos que a função vai receber.
Segue exemplo onde usamos o rest parameters para declarar uma função que recebe uma quantidade variável de números como parâmetros e retorna a soma desses números. Neste exemplo também vamos usar o "spread operator":
Uso de rest parameters na desestruturação de objetos (ou arreglos)
Como já sabemos, o rest parameters é usado na declaração de uma função, mas acontece que também podemos usar o rest parameters na desestruturação de um objeto (ou um arreglo também) para armazenar o restante das propriedades do objeto que estamos desestruturando dentro de um outro objeto (ou o restante dos itens de um arreglo dentro de um outro arreglo). A seguir um exemplo: