위 코드는 increase 함수에서 추가적인 반환 없이 외부 배열의 값을 변경하는 예제이다. 배열은 하나만 두고 참조를 복사하였기 때문에 원본 배열에 접근하여 작업을 처리할 수 있다.
Deep Copy
Shallow Copy만으로는 배열 혹은 객체가 복제되었다고 보기 어렵다. 일반적으로 복제 혹은 복사라고 하면 참조 뿐만 아니라 대상까지도 복사 되는 경우를 의미할 때가 많으며 코드를 작성할 경우도 이는 마찬가지이다.
수동 복사
직접 객체를 만들고 데이터를 지정하여 복사하는 방법이다. 권장하지 않는다.
constmonster= { no :25, name :"피카츄", type :"전기"};constcopyMonster= { no :monster.no, name :monster.name, type :monster.type};console.log(monster === copyMonster);//false
JSON 복사
JSON 변환 명령을 사용한 복사이다.
JSON.stringify() - 객체를 JSON 문자열로 변환
JSON.parse() - JSON 문자열을 객체로 변환
기존 코드에서는 비교적 간편하게 세부 속성까지 복사가 되므로 자주 사용하는 코드 중 하나이다.
constmonster= { no :25, name :"피카츄", type :"전기"};constcopyMonster=JSON.parse(JSON.stringify(monster));console.log(monster === copyMonster);//false
Object.assign()
ES6의 Object.assing() 함수를 이용하는 방법이다. 이 명령은 서로 다른 객체를 병합(merge)할 수 있는 명령이지만 빈 객체와 합치면 기존 객체가 깊은 복사가 되는 효과가 발생한다.
constmonster= { no :25, name :"피카츄", type :"전기"};constcopyMonster=Object.assign({}, monster);console.log(monster === copyMonster);//false
rest
구조 분해 할당 문법에서 사용할 수 있는 rest 연산이 있다. 객체에서 특정 항목을 제외한 나머지 항목만 추출하는 명령이지만 이를 이용해도 객체의 깊은 복사가 가능하다.
constmonster= { no :25, name :"피카츄", type :"전기"};const {...copyMonster} = monster;console.log(monster === copyMonster);//false
rest 연산
rest 연산을 사용하면 특정 항목에 대한 제거가 가능하다.
다음 코드는 monster 객체에서 no를 제외한 나머지 항목을 추출하여 객체를 만드는 코드이다.
constmonster= { no :25, name :"피카츄", type :"전기"};const {no,...copyMonster} = monster;