Médio JavaScript

Soma com número variável de argumentos

Enunciado

Crie uma função somarTudo que aceita qualquer quantidade de números e retorna a soma de todos eles. Use o operador rest para agrupar os argumentos.

Requisitos

  • A função deve se chamar somarTudo.
  • Deve usar o operador rest (...) para receber os números.
  • Deve retornar a soma de todos os números passados.
  • Se nenhum número for passado, deve retornar 0.

Código inicial

// Crie a função somarTudo aqui

Saída esperada

10
0
15
Ver dica

Use function somarTudo(...numeros) { ... } e o método reduce para somar. Lembre-se do valor inicial 0.

Mostrar solução
// Função com parâmetro rest
function somarTudo(...numeros) {
  return numeros.reduce((acc, n) => acc + n, 0);
}

console.log(somarTudo(1, 2, 3, 4)); // 10
console.log(somarTudo());           // 0
console.log(somarTudo(5, 10));      // 15

Passo a passo

  1. Declaramos somarTudo com o parâmetro rest ...numeros. Isso faz com que todos os argumentos sejam agrupados em um array chamado numeros.
  2. Usamos numeros.reduce() para percorrer o array e acumular a soma.
  3. O primeiro argumento do reduce é a função redutora (acc, n) => acc + n, que soma o acumulador acc ao número atual n.
  4. O segundo argumento do reduce é o valor inicial 0, garantindo que a soma comece em zero mesmo se o array estiver vazio.
  5. A função retorna o resultado da soma.
  6. Testamos com quatro números, sem números e com dois números.

Por que funciona

O operador rest (...) coleta todos os argumentos em um array, permitindo que a função aceite um número variável de parâmetros. O reduce é ideal para reduzir um array a um único valor, e o valor inicial 0 trata corretamente o caso de array vazio.

Erros comuns

  • Esquecer o valor inicial do reduce: se o array estiver vazio, reduce lança erro.
    return numeros.reduce((acc, n) => acc + n); // erro se numeros = []
    
    Corrija passando 0 como segundo argumento.
  • Usar arguments em vez de rest: arguments não é um array verdadeiro e não funciona em arrow functions. Prefira rest.
  • Colocar o rest antes de outros parâmetros: o rest deve ser o último parâmetro. function f(...nums, x) é inválido.

Outra forma de resolver

Usando um loop for...of:

function somarTudo(...numeros) {
  let soma = 0;
  for (const n of numeros) {
    soma += n;
  }
  return soma;
}

Essa abordagem é mais explícita e pode ser mais legível para iniciantes.

Saída esperada

10
0
15