DEV Community

Mateus Vinícius
Mateus Vinícius

Posted on

Shallow Copy vs Deep Copy no JavaScript

Uma shallow copy de um objeto é uma cópia que, embora aponte para uma referência diferente do objeto original, suas propriedades ainda apontam para as mesmas referências na memória. Portanto, embora sejam objetos diferentes, a alteração do valor de uma propriedade do objeto original também alterará o valor da mesma propriedade na cópia, e vice-versa.

É possível criar uma shallow copy usando o método Object.assign, spread operator e etc.

const person = {
    name: 'Tom',
    age: 55,
    bestFriend: {
        name: 'Rob',
        age: 33
    }
}

// Shallow copy
const person2 = {...person}

console.log(person === person2) // false

console.log(person.bestFriend === person2.bestFriend) // true

person.bestFriend.name = 'Ben'

console.log(person.bestFriend.name) // Ben
console.log(person2.bestFriend.name) // Ben
Enter fullscreen mode Exit fullscreen mode

Importante lembrar que, no JavaScript, todo valor primitivo (como número, string, etc.) é armazenado diretamente no objeto, e não apenas sua referência na memória. Por isso, mesmo em uma shallow copy de um objeto, suas propriedades primitivas serão diferentes e a modificação do valor no objeto original não afetará o valor na cópia, e vice-versa.

const person = {
    name: 'Tom',
    age: 55,
    bestFriend: {
        name: 'Rob',
        age: 33
    }
}

// Shallow copy
const person2 = {...person}

console.log(person === person2)

person.name = 'Bob'
console.log(person.name) // Bob
console.log(person2.name) // Tom
Enter fullscreen mode Exit fullscreen mode

Já a deep copy é o oposto de uma shallow copy, sendo uma cópia do objeto em que todas as referências apontam para locais diferentes na memória em relação ao objeto original. Dessa forma, alterar o valor de uma propriedade no objeto original não afetará o valor da mesma propriedade na cópia, e vice-versa.

É possível criar uma deep copy de um objeto usando o método JSON.parse, a biblioteca lodash do Node ou uma função recursiva que utilize spread operator.

const person = {
    name: 'Tom',
    age: 55,
    bestFriend: {
        name: 'Rob',
        age: 33
    }
}

// Deep copy
const person2 = JSON.parse(JSON.stringify(person))

console.log(person === person2) // false

console.log(person.bestFriend === person2.bestFriend) // false

person.bestFriend.name = 'Ben'

console.log(person.bestFriend.name) // Ben
console.log(person2.bestFriend.name) // Rob
Enter fullscreen mode Exit fullscreen mode

Compreender as diferenças entre shallow copy e deep copy pode ajudar a evitar erros ou mudanças inesperadas nos valores dos objetos.

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay