Study/JavaScript

[JavaScript_study] 값과 참조의 차이

갈푸라떼 2022. 4. 10. 18:59

* 원시(Primitive)타입과 객체(Object)타입의 비교
  > 원시타입은 메모리 셀 안에 값이 바로 들어가있으며 변수가 그 메모리 자체를 가르키고 있다.
  > 객체타입은 메모리의 주소(참조값)를 가르키고있다.

* 원시타입의 값 복사
  > Copy by value(Call by value와 동일한 개념) //  (값에 의한 호출)
  > 값 자체가 복사되어진다.
    ex) let a = 1 // a = b // b; 1 => b에 다른 값을 할당할 경우 b의 값만 단독으로 변한다.

* 객체타입의 값 복사
  > Copy by Reference(Call by reference와 동일한 개념) // (참조에 의한 호출)
  > 값을 복사할경우 해당 객체가 참조하고 있는 참조값(메모리 주소, 레퍼런스)가 복사된다.
  > 따라서 값을 변경하면 둘다 값이 변경이 된다.
  > Spread Operator혹은 Object.assign()을 이용하여서 값을 복사 하여야 한다.

 

     [ 주의사항 ] 

     : 해당 복사도 1depth의 범위까지 복사가 되니 유의해야한다.

     : 객체안의 객체까지는 복사안된다. 복사를 하려면 객체안의 객체도 Spread Operator혹은 Object.assign()을 이용하여서 값을 복사 해야한다.

 

// 원시타입은 값이 복사되어 전달됨
// 따라서 a의 값의 변화가 b의 값의 변화에 영향을 미치지 않는다.
let a = 1;
let b = a; //1
b = 2;
console.log(a);
console.log(b);

// 객체타입은 참조값(메모리주소, 레퍼런스)가 복사되어 전달됨
// 서로 같은 참조를 가르키고 있으므로 서로의 값의 변화에 영향을 미친다.
let apple = {
  // 0x1234
  name: '사과',
};
let orange = apple; // 0x1234
orange.name = '오렌지';
console.log(apple);
console.log(orange);