// 참조형 복사하기(객체4 - 함수로 지정 / 복제한 객체지만 배열에 대한 값을 수정하는 경우 기존의 주소값과 같이 반영됨.)
function cloneObject(object) {
let temp = {};
for ( let key in object ) {
temp[key] = object[key];
}
return temp;
}
let course8 = {
title: '파이썬 프로그래밍 기초',
language: 'Python',
prerequisite: [] // 복제하는 순간, 배열형식이라서 바로 주소값 연결됨.
}
let course9 = cloneObject(course8);
course9.title = '자료 구조3';
course9.prerequisite.push('파이썬 프로그래밍 기초');
console.log(course8); //{ title: '파이썬 프로그래밍 기초', language: 'Python' }
console.log(course9); //{ title: '객체 지향 프로그래밍', language: 'Python' }
아까 for..in.. 문 함수적용 한 건 같은데, course8의 프로퍼티의 값이 배열인 경우가 있다.
이럴 때, 배열프로퍼티에 값을 넣으면 주소값이 그대로 복사 되기 때문에... 이를 해결하기 위해서는 다음과 같은 어려운 코드가 동반되어야 한다.
// 참조형 복사하기(객체3 - 함수로 지정 / 주소값 연결을 끊기 위한 식)
function cloneObject(object) {
// 순서2
// 널값이거나, 객체가 아닌 경우
if (object === null || typeof object !== 'object') {
return object;
}
// 순서3
let temp;
// 배열이라면,
if (Array.isArray(object)) {
temp = [];
// 객체라면,
} else {
temp = {};
}
// 순서1
for (let key of Object.keys(object)) {
// Object.keys() 는 배열형태로 바뀌기 때문에 for( key of Array ) 형태이다.
temp[key] = cloneObject(object[key]);
// value가 문자열 형태는 그대로 들어가고, 배열 형태는 [] 을 배정받을수 있도록 자체 함수를 적용한다. 그리고 return;
}
return temp;
}
let course10 = {
title: '파이썬 프로그래밍 기초',
language: 'Python',
prerequisite: []
}
let course11 = cloneObject(course10);
course11.title = '자료 구조3';
course11.prerequisite.push('파이썬 프로그래밍 기초');
console.log(course10); //{ title: '파이썬 프로그래밍 기초', language: 'Python', prerequisite: [] }
console.log(course11); //{ title: '자료 구조3', language: 'Python', prerequisite: [ '파이썬 프로그래밍 기초' ] }
보기만 해도 아주 토가 나온다. 새벽에 볼만한 코드는 아닌거 같다.
코드흐름순서를 주석으로 기재해놓았으니 참고하면 될거 같다.
일단 올려놨으니, 생각날때마다 와서 봐야될 거 같다.