shallow copy(얕은 복사)와 deep copy(깊은 복사)에 대해 다시한번 고찰(참고 링크1,참고 링크2)
Object.assign() 로 shallow copy 하기
전개연산자 ... 로 shallow copy 하기
재귀함수로 deep copy 하기
JSON.stringfy() 를 사용해 deep copy 하기
js lodash library 의 _.cloneDeep 사용해 deep copy 하기 [deep copy 추천 방법]
오늘 느낀점
함수의 매개변수의 개수가 유동적일 때[ES5]: arguments 키워드 사용한다. /[ES6]: Rest Parameter ... 라는 전개 연산자(spread) 를 사용한다.[차이점]arguments 는 배열같이 보이지만 배열이 아닌 유사배열이고, 전개 연산자(spread 문법) ... 는 배열이다.
shallow copy 와 deep copy 를 이해하기 위해서는 먼저, value type 과 reference type 을 알아야한다. 이 사실을 몰랐을 때 나는 단지 shallow copy 는 원본의 주소를 reference(참조)하기 때문에 변경되는 copy 이고, deep copy 는 value(값) 자체를 copy하는 것이라고 이해를 했다. 결과만 보면 맞는 이야기인것 같지만, 기준이 있다. primitive value(원시값) 은 value type 으로 값 자체를 copy 한다. 반면에 객체 같은 reference type 은 값 자체가 아닌 메모리 주소값 참조를 copy 한다. [주의할점] deep copy 라고해서 객체의 모든 것을 복사하지 않는다는 점을 주의해야 한다. 예를 들어 객체 내부에 객체가 있는 형태의 경우에는 하위 객체는 완전히 copy 되지 않고, 참조한다.
let 키워드로 선언한 변수가 reference type 일 때, 재할당을 할 경우 heap memory (주소)가 바뀌어 비효율적인 방법이다. 따라서 재할당이 빈번한 변수의 경우에는 const 로 선언해 메모리 낭비를 방지할 수 있다.