깊은복사와 얕은복사의 차이는 기본형과 참조형 복사의 차이에 있다.
변수 복사 과정에 있어 '기본형도 주솟값을 참조한다' 가 맞지만 참조형과의 차이는 '객체의 변수(프로퍼티) 영역' 이 별도로 존재 한다 는 점입니다.
let num1 = 10
let num2 = num1
num2=15
console.log(num1) // 10
console.log(num2) // 15
let num2=num1 에서 num2도 num1과 같은 데이터 '10'을 가지고 있는 주솟값을 바라보지만
num2=15라고 재할당 하는 순간 num2는 새로운 데이터 '15'의 주솟값을 바라보게 됩니다.
주솟값을 복사하는 과정이 한 번만 이뤄지며 독립적인 메모리에 값(ex '15) 자체를 할당하여 생성하는 것이라 볼 수 있다.
let a = 10;
let b = a;
let obj1 = { c: 10, d:'ddd}
let obj2 = obj1
b=15;
obj2.c = 20;
데이터가 그대로 생성되는 것이 아닌 해당 데이터의 참조 값(메모리 주소)를 전달하여 결국 한 데이터를 공유합니다.
*사진 출처 코어자바스크립트
obj2.c=20 이라고 변경을 하여도 같은 주솟값을 바라보기 때문에 obj1의 c값도 20이다.
⭐️ 따라서 불변 객체가 필요한 이유 : 전달 받은 객체에 변경을 가하더라도 원복 객체는 변하지 않아야 하는 경우가 종종 발생하기 때문에
Object.assign(생성할 객체, 복사할 객체) 메서드의 첫번째 인수로 빈 객체를 넣어주며, 두번째 인수로 할당할 객체를 넣으면 된다.
const obj = { a: 1 };
const newObj = Object.assign({}, obj);
newObj.a = 2;
console.log(obj); // { a: 1 }
console.log(obj === newObj); // false
const obj = {
a: 1,
b: 2,
};
const newObj = { ...obj };
newObj.b = 3;
console.log(obj); // { a: 1, b: 2 }
console.log(newObj); // {a:1, b:3 }
const obj = {
a: 1,
b: {
c: 2,
},
};
const newObj = { ...obj };
newObj.b.c = 3;
console.log(obj); // { a: 1, b: { c: 3 } }
console.log(obj.b.c === newObj.b.c); // true
객체를 JSON문법으로 표현된 문자열로 전환했다가 다시 JSON객체로 바꾸는 방법
httpRequest 로 받은 데이터를 저장한 객체를 복사할 때 등 순순한 저보만 다룰 때 활용하기 좋은 방법입니다.
const obj = {
a: 1,
b: {
c: 2,
},
};
const newObj = JSON.parse(JSON.stringify(obj));
newObj.b.c = 3;
console.log(obj); // { a: 1, b: { c: 2 } }
console.log(obj.b.c === newObj.b.c); // false