Salve, Heitor!
Primeiro eu quero deixar aqui os parabéns pela excelente pergunta. Querer entender como isso acontece, essa curiosidade, é uma característica fundamental na vida do dev. De verdade.
Mas vamos a sua dúvida: quando você cria um objeto em JavaScript, como as suas tarefas, e o coloca em um array, o que está armazenado no array não é o objeto em si, mas uma "seta" que aponta para onde o objeto está guardado na memória. É como se o array tivesse uma lista de endereços, e não uma lista de objetos de verdade.
Então, quando você passa o objeto tarefa para a função criarElementoTarefa, o que está sendo passado não é uma cópia do objeto, mas sim a referência a ele, ou seja, o endereço onde ele está armazenado. Isso significa que qualquer alteração que você fizer no objeto dentro da função vai refletir no objeto original no array. É como se você tivesse um controle remoto que pode mudar as coisas na casa (o objeto tarefa) mesmo estando do lado de fora (na função criarElementoTarefa).
No seu código, quando você faz tarefa.descricao = novaDescricao
, você está mudando a propriedade descricao
do objeto tarefa
que está no array
tarefas. Isso acontece porque tarefa é uma referência ao objeto no array, não uma cópia independente dele.
Agora, passagem por valor é um pouco diferente. Imagine que você tem um número ou uma string. Quando você passa isso para uma função, o JavaScript faz uma cópia dessa string ou número. Então, se você mudar ele dentro da função, o original (fora da função) fica intacto. É como mandar uma foto da sua casa pelo correio; quem recebe pode pintar a foto, mas a sua casa real não muda de cor.
Então, resumindo: no JavaScript, objetos e arrays são passados por referência (o endereço onde estão na memória), enquanto coisas como números e strings são passados por valor (uma cópia do valor original).
Espero que isso ajude a clarear as coisas! Qualquer dúvida, estamos aqui para ajudar. Continue explorando e aprendendo!
E, mais uma vez, excelente pergunta!
Siga nessa direção, você está fazendo as perguntas certas.
Isso é um bom sinal :)