복제와 참조

복제 와 참조

원시데이터타입은 복제, 객체는 참조

1. 변수에 담겨있는 값이 객체인 경우 같은 객체를 바라보게되므로 참조를하게된다. 즉 객체가 저장되어있는 메모리 주소인 객체에 대한 참조 값이 저장된다.

2. 변수에 담겨있는 값이 원시데이터타입인 경우 복제시 같은 데이터를 참조하지않고 같은 값의 데이터를 각각 소유한다.

객체를 다른 변수에 할당하면 객체에 대한 참조 값이 하나 더 만들어진다. 하지만 객체도 참조하지않고 복제할 수 있는 방법이 있다.

1번. 빈 객체를 생성하고  프로퍼티값을 설정해준다. 설정해줄때는 기존에 복제하고자하는 객체를 for in문으로 순회하면서 프로퍼티 키와 값을 저장해주면 값은 똑같으면서 독립적인 객체가 생성된다.

2번. Object.assign() 을 사용하면 반복문 없이도 간단하게 객체를 복사할 수 있다.

// ### 복제1 ### //
var a = 1;
var b = a;
b = 2;
console.log(a); // 1
// ### 참조 ### //
var a = { id : 1 };
var b = a;
b.id = 2;
console.log(a.id); // 2

// ### 복제2 ### //
var a = { id : 1 };
var b = a;
b = { id : 2 };
console.log(a.id); // 1

-#복제1#의 경우 숫자를 값으로 할당하고 있는데 숫자(Number)는 원시데이터타입으로 값을 참조하지않고 복제를 하게된다. 그러므로 b에 할당된 a의값이 변경되더라도 별개의 데이터이기때문에 오리지널 a의 데이터를 변경시키지 않는다.

-#참조#를 보면 값을 원시데이터타입이아닌 객체로 할당받은경우 복제가아닌 참조를 하게되는데 이 경우 참조하고있는 a의 값을 2로 변경하였기 때문에 a.id값도 2가 출력된다.

-#복제2#의 경우 a는 객체를 할당받아 변수b는 a객체 { id : 1}을 참조하지만 b = { id :2 }와같이 작성하게되면 더이상 참조가아닌 새로운 객체를 생성하여 값으로 할당한것이므로 a객체의 값은 변경되지 않는다.



참고
원시 데이터 타입(primitive type)인 String, Number, Boolean, Null, Undefined, Symbol 을 제외한 나머지는 모두 객체이다. 

댓글