JavaScript의 변수는 어떤 특정 타입과 연결되지 않기때문에 모든 타입의 값으로 할당, 재할당이 가능하다. 또한 타입은 원시 값과 객체로 나뉜다.
객체는 속성의 컬렉션이라 할 수 있다. 객체 리터럴 구문을 사용해 제한적으로 속성을 초기화하거나 추가, 제거할 수 있다. 속성값으로 다른 객체를 포함 모든 타입을 사용할 수 있다. 이러한 속성들은 'Key'값으로 식별하며 이는 문자열, 심볼을 사용할 수있다.
** 객체의 속성으로는 데이터 속성과 접근자 속성이 있다.
이러한 참조 값(a)을 다른 변수(b)에 할당하게 되면 b는 a의 실체값을 할당 받는게 아니라 "주소"값을 할당받는다. 즉 a 와 b 는 같은 객체안에서 데이터를 공유하게 된다. 이러한 경우를 얕은 복사(Shallow Copy)라 하며 데이터가 의도치 않게 같이 변해버리는 위험이 있다.
위와 같은 문제를 회피하기 위한 깊은 복사(Deep Copy)에는 몇가지 방법이 있다.
1. Object.assign()
: assign 메소드는 빈객체에 복사할 객체를 그대로 복사할 수 있다.
2. Spread 연산자
const rootObj = { name: Dalaran } const copyObj = {...rootObj}
위의 두 방법은 깊이 2 (객체안에 객체) 이상일 경우에는 얕은 복사가 발생하는 문제점이 있다.
3. lodash 모듈 사용
: npm install lodash로 모듈 설치 후 require("lodash")로 가져온 뒤 .cloneDeep()함수를 사용
이 방법은 위의 단점을 보완할수는 있지만 lodash 모듈을 설치해야만 사용할 수 있는 단점이 있다.
[참고 사이트]
https://imagineu.tistory.com/49
https://developer.mozilla.org/ko/search?q=deep+copy