참조 타입과 원시 타입의 근본적인 차이 중 하나는 참조 타입은 말 그대로 Pass by Reference, 참조에 의해 복사된다는 점입니다. 그래서 우리가 변수를 복사하듯 새로운 변수에 기존 변수를 복사하면 동일한 메모리 주소를 바라보게 되고, 복사한 변수의 값을 변경하면 두 변수 모두 값이 변하게 됩니다.
만약에 아예 독립적인 객체로 복사하고 싶다면 빈 객체를 하나 선언하고 대상이 되는 객체의 프로퍼티 전부를 반복문을 통해 복사해서 넣거나 Object.assign() 메소드를 활용해서 복사를 하면 됩니다. 다만 객체 안쪽에 프로퍼티가 다시 객체인 경우, 즉 중첩객체인 경우에는 또 다시 참조값이 복사되기 때문에 완전히 독립적인 복사가 불가능합니다. 그래서 이를 얕은 복사(Shallow copy)라고 부르고, 별도의 깊은 복사(Deep copy)가 존재합니다.
중첩 객체까지 복사가 가능한 깊은 복사(Deep copy)는 표준 알고리즘이 있긴 하지만 주로 전개 연산자나 lodash 라이브러리의 내장 함수인 _.cloneDeep() 함수를 통해서 구현하는 편입니다.