let obj = {
name: 'Ed',
age: '34'
}
let obj2 = obj; // (1)
텍스트
let obj2 = {...obj} // (2)
객체는 참조형 데이터이다. 객체의 식별자는 주소를 가리킨다.
obj 객체를 (1)을 사용하여 복제하면 obj2도 obj와 같은 주소를 가리킨다.
그래서 복제한 obj2의 속성을 바꾸면 원본인 obj의 속성도 바뀌는 문제가 생긴다.
obj2.name = 'sheeran';
console.log(obj.name) // 'sheeran'
(2)는 전개구문을 사용하여 복제한 것이다.
let obj2 = { name: 'sheeran', age: '34' }
console.log({...obj}); // { name: 'Ed', age: '34' }
윗쪽 코드처럼 완전히 새로운 객체로 할당해주면 속성의 값이 완전히 똑같아도
새로운 주소를 가리키게 된다.
그래서 (2)를 사용해서 복제하면 (1)에서 생기는 문제를 막을 수 있다.
❗ 객체 안에 객체가 있다면?
(2)의 방법을 '얕은 복사'라 한다.
객체가 속성으로 객체를 가진다면, 그리고 또 그 객체가 객체를 속성으로 가진다면?
재귀를 이용한다.
메소드가 자기 자신을 호출한다.
1. copyObject 메소드는 리턴할 새로운 객체를 만든다.
2. 매개변수로 복제할 개체 obj를 넣으면 객체의 속성을 루프를 돌면서 검사한다.
3. 속성이 객체이면서 비어있지 않으면 객체의 속성을 하나씩 새 객체에 복사한다.
4. for in문을 사용하여 obj의 속성은 copyObject 메소드를 통해 검사받는다.
5. 객체가 아니면 그대로 속성이 복사된다. 객체라면 copyObject의 재귀로 그 객체의 복사를 시작한다.
6. 이렇게 더이상 속성이 개체가 나오지 않을때까지 반복한다.
var copyObject = function (target) {
result = {};
if (typeof target === 'object' && target !== null) {
for (var prop in target) {
result[prop] = copyObject(target[prop]);
}
} else {
result = target;
}
return result;
};
for (var prop in target) {
result[prop] = copyObject(target[prop]);
}
{ } = target(객체x) 를 하면 result는 target의 데이터 타입으로 형 변환된다.
result = {};
result = target;