객체 복사의 문제점
- Object의 값을 복사할 때는 객체 자체가 아닌, 메모리 주소가 복사됩니다.
- 복사한 객체의 속성을 변경하면, 기존 객체의 속성까지 변경되는 문제가 발생합니다.
const original = {
first: 1,
second: 2,
};
const copy = original;
delete original.first;
console.log(original);
console.log(copy);
객체 복사 해결 방법1: 얕은 복사
- 얕은 복사1: for문으로 일일이 복사
const original = {
first: 1,
second: 2,
};
const copy = {};
for (const key in original) {
copy[key] = original[key];
}
delete original.first;
console.log(original);
console.log(copy);
- 얕은 복사2: Object.assign({}, original)
const original = {
first: 1,
second: 2
};
const copy = Object.assign({}, original);
delete original.first;
console.log(original);
console.log(copy);
- 얕은 복사3: spread 연산자 { ...original }
const original = {
first: 1,
second: 2
};
const copy = { ...original };
delete original.first;
console.log(original);
console.log(copy);
얕은 복사의 문제점
- 객체 속성값(value)으로 또다른 객체나 배열이 있으면, 기존에 발생했던 문제가 똑같이 발생합니다.
const original = {
first: 1,
second: 2,
third: {
number: 3
},
};
const copy = { ...original };
delete original.third;
delete original.third.number;
console.log(original);
console.log(copy);
객체 복사 해결 방법2: 깊은 복사 (얕은 복사에서 나타나는 문제 해결)
- 깊은 복사1: for문으로 일일이 복사 + 재귀함수 추가 실행
const original = {
first: 1,
second: 2,
third: {
number: 3
},
};
function change(obj) {
const result = {};
for (const key in obj) {
if (typeof obj[key] === "object") {
result[key] = change(obj[key]);
} else {
result[key] = obj[key];
}
}
return result;
};
const copy = change(original);
delete original.third.number;
console.log(original);
console.log(copy);
- 깊은 복사2: JavaScript 객체를 -> JSON 문자열로 변환 후 -> JSON 문자열을 다시 javascript 객체로 변환
const original = {
first: 1,
second: 2,
third: {
number: 3
},
};
const copy = JSON.parse(JSON.stringify(original));
delete original.third.number;
console.log(original);
console.log(copy);
참고: 배열 복사
- 배열 복사의 문제점
- 객체 복사와 같은 문제가 발생합니다.
const original = [1, 2, 3, 4, 5, 6];
const copy = original;
console.log(original);
console.log(copy);
copy.shift();
console.log(original);
console.log(copy);
- 해결 방법1: 얕은 복사
const oriShallow = [1, 2, 3, 4, 5, 6];
const copyShallow = [ ...oriShallow ];
console.log(oriShallow);
console.log(copyShallow);
copyShallow.shift();
console.log(oriShallow);
console.log(copyShallow);
- 얕은 복사의 문제점
- 2차원 배열에서 객체 얕은 복사와 같은 문제가 발생합니다.
const oriShallowProblem = [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]];
const copyShallowProblem = [ ...oriShallowProblem ];
console.log(oriShallowProblem);
console.log(copyShallowProblem);
copyShallowProblem[0].shift();
console.log(oriShallowProblem);
console.log(copyShallowProblem);
- 해결 방법2: 깊은 복사
const oriDeep = [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]];
const copyDeep = JSON.parse(JSON.stringify(oriDeep));
console.log(oriDeep);
console.log(copyDeep);
copyDeep[0].shift();
console.log(oriDeep);
console.log(copyDeep);
- 배열 -> 객체 안에 복사 (spread 연산자)
- 배열을 객체로 펼치면, 객체 안에 인덱스가 key, 배열요소가 value 로 들어갑니다.
const names = ['길동', '철수', '영희', '무명'];
const obj = { ...names };
console.log(obj);
- 객체 -> 배열 안에 복사 (TypeError)
- 배열은 객체로 펼칠 수 있지만, 객체는 배열로 펼칠 수 없습니다.
const topic = {
name: '모던 자바스크립트',
language: 'JavaScript',
};
const newArray = [ ...topic ];