기본형
데이터는 값을 그대로 할당하는 것이다.
메모리상에 고정된 크기로 저장되며 원시 데이터 값 자체를 보관하므로 불변적이다.
참조형
은 변수에 할당할때 값이 아닌 데이터의 주소를 저장한다.
객체가 담겨있는 변수를 다른 변수에 할당하면 call by reference (데이터 복사가 아닌 참조)가 일어나게 되어, 한 변수의 데이터를 변경하면 다른 변수의 데이터도 함께 변경이 된다.
const person1 = {name:"daeun"};
const person2 = person1;
person1.name = 'lee'; //person1.name === person2.name
person1 === person2; // true - 같은 데이터 주소를 바라보고 있는 두 변수
해당 데이터의 메모리 주소를 전달하게 돼서, 결국 한 데이터를 공유하게 된다.
데이터의 공유가 아닌 똑같은 구조의 객체를 하나 더 생성하여 따로 사용해야 할 경우
const person1 = { name: "daeun" };
const person2 = Object.assign({}, person1);
person1.name = "lee";
//person1.name !== person2.name 전혀 다른 메모리 주소의 데이터이므로, person2의 값은 변하지 않음.
person1 === person2 // false - 형태만 같고 각자 다른 메모리 주소에 저장되어 있다
데이터 참조가 아닌 객체의 형태를 그대로 복사하게 함으로써, 한 객체가 변경되도 다른 객체의 데이터에는 영향이 없다.
const Obj1 = { a: { b: 1 } };
const Obj2 = { ...Obj1 };
Obj1 === Obj2 // false
Obj1.a === Obj2.a // true
깊은 복사를 하려는 형태에 맞게 재귀 함수를 만들어서 복사를 해야한다.
사용하는 Object의 Depth가 길어질수록 Time Complexity(시간 복잡도)도 늘어나게 된다.
자바스크립트 고차함수 집합 및 함수형 라이브러리이다.
Lodash의 cloneDeep 함수를 사용하면, 완벽하게 깊은 복사를 할 수 있다.
JSON.stringify 함수를 이용해서, Object 전체를 문자열로 변환 후, 다시 JSON.parse 함수를 이용해서 문자열을 Object 형태로 변환한다. 그러면 문자열로 변환하는 순간 참조 값이 끊기기 때문에 새로운 Object로 만들어 사용할 수 있다. 하지만 JSON 함수는 엄청나게 리소스를 잡아먹는 함수인 만큼, 성능이 좋지 않은 부분을 고려해야 한다
헉 다은님! 저 안그래도 어제 목요일 세션 회고 정리하다가 기본형이랑 참조형, 얕은 복사랑 깊은 복사도 다시 한번 봐야지~하고 있었는데 다은님 블로그 왔다가 제대로 이해하고 갑니다!🙌 완벽한 깊은 복사 하는 법까지 알려주는 정보 맛집이네요...👍 나머지 글들도 다 정독해보겠습니다!🤩