참조에 의한 객체 복사

황성호·2021년 2월 28일
0

객체는 ‘참조에 의해(by reference)’ 저장되고 복사됨
원시값(문자열, 숫자, 불린 값)은 ‘값 그대로’ 저장·할당되고 복사됨

참조에 의한 복사 예시

let user = { name: 'John' };

let admin = user;

admin.name = 'Pete'; // 'admin' 참조 값에 의해 변경됨

alert(user.name); // 'Pete'가 출력됨. 'user' 참조 값을 이용해 변경사항을 확인함

참조에 의한 복사가 아닌 정말 새로운 객체에 값을 복사하고 싶을때!

let user = {
  name: "John",
  age: 30
};

let clone = {}; // 새로운 빈 객체

// 빈 객체에 user 프로퍼티 전부를 복사해 넣습니다.
for (let key in user) {
  clone[key] = user[key];
}

// 이제 clone은 완전히 독립적인 복제본이 되었습니다.
clone.name = "Pete"; // clone의 데이터를 변경합니다.

alert( user.name ); // 기존 객체에는 여전히 John이 있습니다.

Object.assign 을 사용한 객체 복사(참조에 의한 복제X)

동작방식
1.첫 번째 인수 dest는 목표로 하는 객체입니다.
2.이어지는 인수 src1, ..., srcN는 복사하고자 하는 객체입니다. ...은 필요에 따라 얼마든지 많은 객체를 인수로 사용할 수 있다는 것을 나타냅니다.
3.객체 src1, ..., srcN의 프로퍼티를 dest에 복사합니다. dest를 제외한 인수(객체)의 프로퍼티 전부가 첫 번째 인수(객체)로 복사됩니다.
4.마지막으로 dest를 반환합니다.

Object.assign(dest, [src1, src2, src3...])

let user = { name: "John" };

let permissions1 = { canView: true };
let permissions2 = { canEdit: true };

// permissions1과 permissions2의 프로퍼티를 user로 복사합니다.
Object.assign(user, permissions1, permissions2);

// now user = { name: "John", canView: true, canEdit: true }

리턴값으로도 받을 수 있음

let clone = Object.assign({}, user);

https://ko.javascript.info/object-copy

profile
개발!

0개의 댓글