[JS_오답노트]_객체_완전복사(4)

hanseungjune·2022년 5월 31일
0

JavaScript

목록 보기
60/87
post-thumbnail

일단 필기! ★★★

// 참조형 복사하기(객체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' }

요약1

아까 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: [ '파이썬 프로그래밍 기초' ] }

요약2

보기만 해도 아주 토가 나온다. 새벽에 볼만한 코드는 아닌거 같다.

코드흐름순서를 주석으로 기재해놓았으니 참고하면 될거 같다.

일단 올려놨으니, 생각날때마다 와서 봐야될 거 같다.

profile
필요하다면 공부하는 개발자, 한승준

0개의 댓글