[Javascript] 4.2 참조에 의한 객체 복사

Jimyu·2023년 4월 22일
  • 저장, 복사시
    • 원시 타입(문자열, 숫자, 불린 값) : ‘값 그대로’
    • 객체 : 객체 자체가 아닌 메모리상 주소인 ‘참조에 의해(by reference)’
      - 참조 값: 객체가 저장되어있는 '메모리 주소’ ⇒ 객체가 할당된 변수 복사하면 객체의 참조 값이 복사되고 객체는 복사되지 않음!!
        let user = { name: 'John' };
      
        let admin = user;
      
        admin.name = 'Pete'; // 'admin' 참조 값에 의해 변경됨
      
        alert(user.name); // 'Pete'가 출력됨. 'user' 참조 값을 이용해 변경사항을 확인함

      참조에 의한 비교

    • 객체 비교할 때 동등 연산자 ==와 일치 연산자 ===는 동일하게 동작함(피연산자인 두 객체가 동일한 객체인 경우 참 반환)
       let a = {};
       let b = a; // 참조에 의한 복사
      
      alert( a == b ); // true, 두 변수는 같은 객체를 참조합니다.
       alert( a === b ); // true
    • 대소 비교, 원시값과의 비교 ⇒ 객체가 원시형으로 반환
       let a = {};
       let b = {}; // 독립된 두 객체
      
      alert( a == b ); // false

      객체 복사, 병합, Object.assign

    • 참조 값이 아닌 객체를 복제하고 싶다면?
      방법 1) 새 객체를 만들고, 기존 객체 프로퍼티를 순회해서 원시 수준까지 프로퍼티 복사
         let user = {
           name: "John",
           age: 30
         };
      
      ```jsx let clone = {}; // 새로운 빈 객체
         // 빈 객체에 user 프로퍼티 전부를 복사해 넣습니다.
         for (let key in user) {
           clone[key] = user[key];
         }
      
       // 이제 clone은 완전히 독립적인 복제본이 되었습니다.
         clone.name = "Pete"; // clone의 데이터를 변경합니다.
        
         alert( user.name ); // 기존 객체에는 여전히 John이 있습니다.

⇒ 방법 2) Object.assign 사용

    Object.assign(dest, [src1, src2, src3...])
  • 첫 번째 인수 dest : 목표 객체

  • 인수 src1, ..., srcN : 복사할 객체

  • ... : 얼마든지 많은 객체를 인수로 사용할 수 있음

    ⇒ 객체 src1, ..., srcN의 프로퍼티를 dest에 복사.

    dest를 제외한 인수(객체)의 프로퍼티 전부가 첫 번째 인수(객체)로 복사

  • 마지막으로 dest를 반환

  • 반복문 없이 간단히 객체 복사 가능

        let user = {
          name: "John",
          age: 30
        };
      
       let clone = Object.assign({}, user);//빈 배열에 user의 모든 프로퍼티 복사되고 변수에 할당됨.
    • 목표 객체에 동일한 이름을 가진 프로퍼티가 있으면 기존 값이 덮어씌워짐.(새 값으로 변경)
       let user = { name: "John" };
      
      Object.assign(user, { name: "Pete" });
      
      alert(user.name); // user = { name: "Pete" }

    중첩 객체 복사

    • 객체의 '진짜 복사본’ 만들기
      • '얕은 복사(shallow copy)'를 가능하게 해주는 Object.assign ⇒ 참조값만 복사!
      • '깊은 복사’를 가능하게 해주는 _.cloneDeep(obj) 사용 ⇒ 객체의 구조까지 복사해주는 반복문 사용
      • 얕은 복사본은 중첩 객체를 처리하지 못함
profile
블로그 이전 : https://jimyu-s-record.tistory.com/

0개의 댓글