객체를 프로퍼티 값으로 갖는 객체의 경우
얕은 복사는 한 단계까지만 복사하는 것을 말하고
깊은 복사는 객체에 중첩되어 있는 객체까지 모두 복사하는 것을 말한다.
복사본의 중첩된 구조를 변경하면 원본과 복사본 모두 영향을 받는다.
🙄 얕은 복사가 되는 경우들 (참조 값말고 객체를 복사)
1. 반복문 이용하기

2. Object.assign()
(참고) Object.assign()이란?
메소드는 열거할 수 있는 하나 이상의 출처 객체로부터 대상 객체로 속성을 복사할 때 사용합니다. 대상 객체를 반환합니다.

ex1)
const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };
const obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 },
//대상 객체 자체가 변경됨.
ex2)
const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const o3 = { c: 3 };
const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
//속성은 파라미터 순서에서 더 뒤에 위치한
//동일한 속성을 가진 다른 객체에 의해 덮어쓰입니다.


3. spread 연산자

두 변수가 완전히 독립성을 갖는 것
깊은 복사된 객체는 객체안에 객체가 있을 경우에도 원본과의 참조가 완전히 끊어진 객체를 말한다.
🙄 깊은 복사가 되는 경우들
1. lodash 라이브러리

2. 재귀함수를 이용한 복사

실행 결과

3. JSON 객체 사용 ( + eval() 메서드 사용)

eval(JSON.stringify(person))을 해도 결과가 똑같다.