Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Não entendi. Referencia e copia

Conseguem me explicar de forma mais detalhada como funciona fazer copia e referencia no JS, e também referente ao método Object.create(). Não entendi muito bem na hora da pratica.

1 resposta
solução!

Oi, Sara!

Vou te explicar:

Referência x Cópia em JavaScript

Tipos primitivos (cópia de valor)

Quando você trabalha com tipos primitivos (números, strings, booleanos, null, undefined, symbol, bigint), o JavaScript cria uma cópia do valor.
Ou seja, cada variável guarda o seu próprio valor independente da outra.

Exemplo:

let a = 10
let b = a

b = 20
console.log(a) // 10
console.log(b) // 20

Aqui, a e b são independentes, cada um tem sua própria caixinha na memória.

Objetos (referência na memória)

Já com objetos, arrays e funções, o que acontece é diferente: a variável guarda apenas um endereço de memória que aponta para o objeto.
Quando você faz const obj2 = obj1, os dois apontam para o mesmo lugar.

Exemplo:

const obj1 = { nome: "Gandalf" }
const obj2 = obj1

obj2.nome = "Saruman"

console.log(obj1.nome) // Saruman
console.log(obj2.nome) // Saruman

Mesmo alterando só obj2, o obj1 também muda, porque os dois são a mesma coisa na memória.

Como criar cópias reais de objetos

Se você quiser ter um novo objeto independente, aí sim precisa fazer uma cópia manual ou usar algum método. Alguns exemplos:

  1. Object.assign()
const obj1 = { nome: "Gandalf" }
const obj2 = Object.assign({}, obj1)

obj2.nome = "Saruman"
console.log(obj1.nome) // Gandalf
console.log(obj2.nome) // Saruman
  1. Spread operator (...)
const obj1 = { nome: "Gandalf" }
const obj2 = { ...obj1 }

obj2.nome = "Saruman"
console.log(obj1.nome) // Gandalf
console.log(obj2.nome) // Saruman

E o Object.create()?

Esse método é um pouco diferente.
Ele cria um novo objeto que tem como protótipo o objeto passado como parâmetro.

Exemplo:

const obj1 = { nome: "Gandalf" }
const obj2 = Object.create(obj1)

obj2.nome = "Saruman"

console.log(obj1.nome) // Gandalf
console.log(obj2.nome) // Saruman

O que acontece aqui?

  • obj2 não é uma cópia simples de obj1.
  • Ele é um novo objeto vazio, mas que tem obj1 como protótipo.
  • Isso significa que, se você acessar uma chave que não existe em obj2, ele vai "herdar" do obj1.

Olha só:

console.log(obj2.classe) // undefined (se não definirmos)
obj1.classe = "Mago"
console.log(obj2.classe) // Mago (herdado do protótipo)

Ou seja, Object.create() é mais usado para criar objetos com herança prototípica, e não exatamente para copiar.

Resuminho:

  • Primitivos: são copiados por valor (cada variável tem seu próprio dado).
  • Objetos: são atribuídos por referência (variáveis diferentes podem apontar para o mesmo objeto na memória).
  • Para copiar objetos: use Object.assign() ou spread ({ ...obj }).
  • Object.create(): cria um objeto novo que herda do protótipo do original, útil para herança, não para simples cópia.

Espero ter ajudado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!