Cópia superficial e cópia profunda são dois assuntos presentes no cotidiano de programadores de linguagens como C e C++, mas que talvez não tenham tanta recorrência para os programadores JavaScript.
Shallow Copy
Em uma explicação rápida, a cópia superficial tem por objetivo copiar objetos fazendo com que propriedades primitivas de alto nível tenham referências diferentes.
Se algo primitivo for alterado no mais alto nível do objeto copiado não fará nenhuma diferença para a cópia.
Deep Copy
Ja a cópia profunda não mantém nenhum tipo de referência entre o objeto copiado e a sua cópia.
Em outras palavras, tanto para propriedades primitivas de alto nível, como para outros objetos aninhados, a referência nunca será a mesma.