참조형 데이터의 복사 숙제

최재홍·2023년 4월 6일
0
  • 가장 아래의 코드가 실행 되었을 때, “Passed ~” 가 출력되도록 getAge 함수를 채워주세요
<script>
var user = {
    name: "john",
    age: 20,
}

var getAged = function (user, passedTime) {
		// 여기를 작성해 주세요!
}


var agedUser = getAged(user, 6);

var agedUserMustBeDifferentFromUser = function (user1, user2) {
    if (!user2) {
		    console.log("Failed! user2 doesn't exist!");
	  } else if (user1 !== user2) { 
        console.log("Passed! If you become older, you will be different from you in the past!")
    } else {
        console.log("Failed! User same with past one");
    }
}

agedUserMustBeDifferentFromUser(user, agedUser);
</script>

객체인 user 데이터를 복사해와서 새로운 객체를 생성하고, 새로운 객체의 'age' 값을 변화시켜서 agedUserMustBeDifferentFromUser함수를 통해 차이를 검증하는 숙제이다.

이 과정을 학습하기 이전에 얼핏 생각했던 대로 agedUser = user로 복사하여 프로퍼티를 조작했다가는 원본의 프로퍼티도 훼손을 받는다는 것을 배웠다. 그러므로 우리는 새로운 객체를 만들어 임의의 메모리 저장공간을 할당 받고, 거기에 기존 user의 프로퍼티를 재할당하여 변경점을 반영해야하는 과제였다.

<script>
var getAged = function (user, passedTime) {
  // 여기를 작성해 주세요!
  let agedUser = {};
  for (const key in user) {
    if (typeof key !== "obj") {
      agedUser[key] = user[key];
    } else {
      getAged(key);
    }
  }
  agedUser["age"] += passedTime;
  return agedUser;
};

</script>

이 경우에는 user객체가 1depth를 가지고 있기 때문에(중첩된 객체구조를 가지고 있지 않기 때문에) '얕은 복사'와 '깊은 복사'를 구분할 필요는 없지만, 연습을 위해서 상기와 같이 적용하였다. getAged함수는 매개변수로 받아오는 user객체에 대해서 user객체의 키에 대해 더이상 객체구조를 만나지 않을 때까지 얕은 복사를 재귀적으로 반복수행한다.

그리고 마지막으로 agedUser["age"] += passedTime;로 변경점을 반영하는데 그대로 끝내버리면 var agedUser = getAged(user, 6);에서 변경된 객체를 받을 agedUser가 return문이 없는 함수의 결과값을 받아오기 때문에 agedUser가 undefined가 되기 때문에 적절한 return문을 만들어서 마무리 해주면 된다.

0개의 댓글