JAVASCRIPT: função é lida anter de ser chamada
Estou instanciando um objeto da base de dados cru com o let db
Ele é enviado pra uma função que muda valores desse objeto, e retorna o objeto já modificado resetTagColors(db)
E eu to dando console log nas etapas pra ler os valores.
Porem a a variável db
quando é lida, já é lida com os valores modificados da função abaixo.
Ele deveria imprimir a versão não alterada, e depois a versão nova, como está no código.
Quando removo as duas últimas linhas, ai sim ele imprime a versão não alterada, a versão cru.
O que está acontecendo? E como posso contornar?
Cara resumindo bastante... Todo tipo que não é primitivo no javascript ele sempre se passa como referência para o parametro, ou seja, se modificar o parametro dentro da function, o valor referido também é modificado. Quando, são tipo primitivos (inteiro, por exemplo) o javascript sempre passa o valor e nunca a referência e isso nunca acontece..
Para resolver seu problema você deve ou fazer uma copia do object e passar pro function ou reatribuir seu parametro com a modificação ou criar um novo object com os dados do antigo e passar os novos dados
export function refreshDB(db_name) {
const db = { name: db_name, color: "#000" }
console.log(db)
const new_db = resetTagColors(db)
console.log(new_db)
}
function resetTagColors(database) {
return {
...database,
color: ""
}
}
(Tentei explicar de uma forma bem resumida, algumas palavras que utilizei, talvez nem sejam adequadas, mas a logica é essa)
Amigo antes de mais nada quero falar que joguei no Chat GPT e ele me deu isso... se não funcionar avisa que eu faço na mão sem problema...
Parece que você está tendo um problema de referência, ou seja, ao passar o objeto db
para a função resetTagColors
, você está passando a referência do objeto em memória, e não uma cópia dele. Isso significa que qualquer alteração feita no objeto dentro da função resetTagColors
será refletida na variável db
também.
Para contornar isso, uma solução seria fazer uma cópia do objeto db
antes de passá-lo para a função resetTagColors
. Você pode fazer isso usando a função Object.assign
, como no exemplo abaixo:
export function refreshDB(db_name) {
let db = getDatabase(db_name)
console.log(db)
let new_db = Object.assign({}, db) // cria uma cópia do objeto db
new_db = resetTagColors(new_db)
console.log(new_db)
}