1
resposta

[Sugestão] Caso Estefany

Creio que o detalhe seja nas referências de variáveis da segunda e terceira função.

Substitua a variável genérica idades por idadesAmigos.

function calculaProximaIdade(idade) {
    idade += 1;
    console.log(idade);
}

function calculaProximasIdades(idadesAmigos) {
    for (let i = 0; i < idadesAmigos.length; i += 1) {
        idadesAmigos[i] += 1;
    }
    console.log(idadesAmigos);
}

function calculaIdadesDaqui5Anos(idadesAmigos) {
     for (let i = 0; i < idadesAmigos.length; i += 1) {
        idadesAmigos[i] += 5;
    }
    console.log(idadesAmigos);
}

const idadeStefany = 21;
calculaProximaIdade(idadeStefany);

const idadesAmigos = [idadeStefany, 20, 23, 18, 7];
calculaProximasIdades(idadesAmigos);

calculaIdadesDaqui5Anos(idadesAmigos);
1 resposta

Oi Denylson, tudo bem?

Mesmo que a gente faça a substituição do nome, ainda teremos o mesmo problema de alterar os valores das idades que estão dentro da lista. Veja este exemplo:

function imprimeValor(valorParaImprimir) {
    console.log(valorParaImprimir);
}

idade = 5;
imprimeValor(idade);

Perceba que na função imprimeValor nós damos um nome pro valor que vai vir como parâmetro dentro dos parênteses quando a gente for chamar a função. Então mesmo que na invocação a gente chame imprimeValor(idade), lá dentro da função imprimeValor essa idade vai ser referenciada como valorParaImprimir. Esse nome poderia ser qualquer coisa e mesmo assim o comportamento da função seria o mesmo pois aqui estamos apenas definindo como vamos chamar esse valor ali dentro da função.

Seguindo adiante, o problema abordado na atividade é que quando passamos uma lista como parâmetro, estamos passando não uma cópia da lista mas sim uma indicação de onde essa lista está na memória, uma referência. Isso significa que ao manipularmos os valores das idades ali dentro da função, por exemplo, idadesAmigos[i] += 5, estamos seguindo a referência que foi passada como parâmetro e alterando diretamente o valor dentro da lista lá na memória. Lembrando que idadesAmigos[i] += 5 é equivalente a idadesAmigos[i] = idadesAmigos[i] + 5 e aí estamos atribuindo um novo valor que é armazendo dentro da lista. E o que vai acontecer quando a função terminar? Todas as alterações que fizemos na lista vão persistir e aí agora não temos mais as idades originais mas sim todas as idades acrescidas do valor 5.

Como podemos evitar isso? Temos duas possibilidades, ou fazemos uma cópia da lista no início da função pra poder modificar sem se preocupar ou então não fazemos a modificação dos valores, apenas imprimimos o valor modificado. Por exemplo:

function calculaProximasIdades(idadesAmigos) { 
    for (let i = 0; i < idadesAmigos.length; i += 1) { 
        console.log(idadesAmigos[i] + 1); 
    } 
}

Nesse alternativa, imprimimos cada uma das idades mas não fazemos uma atribuição dentro da lista e desse modo a lista não é modificada.

Esse comportamentos podem ser um pouco confusos no começo mas vale a pena fazer esses testes e ver como tudo acontece na prática.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software