티스토리 뷰

1. 값에 의한 전달(call by value)

var temp = 7;
var copy = temp;

temp = 1;

console.log(temp);
console.log(copy);​

원시 값을 갖는 변수(temp)를 할당하면 할당 받는 변수(copy)에는

할당되는 변수(temp)의 원시 값이 복사되어 전달된다.

 

따라서 temp와 copy는

다른 메모리 공간에 저장된 별개의 값이다.

 

temp의 값을 변경해도

copy 값에는 어떠한 영향도 주지 않기 때문에

데이터의 신뢰성을 유지할 수 있다.

 

 

값에 의한 전달

식별자는 메모리 주소에 붙인 이름이다.

더 엄격하게 표현하면

변수에는 메모리 주소가 전달되고 그 메모리 주소를 기억하게 된다.

 

값에 의한 전달도 메모리 주소를 전달한다.

전달된 메모리 주소를 통해

메모리 공간에 접근하면 값을 참조할 수 있다.

 

결국 두 변수의 원시 값이

서로 다른 메모리 공간에 저장된 별개의 값이기에 서로 간섭할 수 없게 된다.

 

편의상 값에 의한 전달이란 용어를 사용하고 있지만 이는 자바스크립트를 위한 용어가 아니기 때문에
공유에 의한 전달(pass by sharing)이란 표현을 사용할 때도 있다.

 

2. 참조에 의한 전달(call by reference)

var character = {
  emoji: '😀'
};

var copy = character;

 

객체를 가리키는 변수(character)는 다른 변수(copy)에 할당하면

원본의 참조 값복사되어 전달된다.

 

두 식별자 모두 동일한 객체를 가리키기 때문에

두 개의 식별자하나의 객체를 공유한다.

 

어느 한쪽에서 객체를 변경하면 서로 영향을 주고 받는다.

객체에 의한 전달

3. 결론

공통적으로

식별자가 메모리 공간에 저장되어 있는 값

전달한다는 면에서 동일하다.

 

다만 변수에 저장되어 전달되는 값이

원시 값이냐 참조 값이냐에 따라 변한다.

 

원칙적으로 자바스크립트에는

값에 의한 전달만 있고

전달되는 값의 유형만 다를 뿐이지만

편의상 둘로 나누어 부른다.

 

정확한 동작 방식을 설명하는 용어는 존재하지 않고 ECMAScript에서도 언급되지 않는다.

 

 

4. 저장

 

참고로

객체를 포함한 참조타입은 메모리 힙(memory heap)에,

원시 타입의 데이터콜스택(call stack)에 저장된다.

 

위의 예제에서 보여지는 참조 타입 데이터는

{
  emoji: '😀';
}

메모리 힙에 따로 저장되지만

그 메모리 힙의 주소값(0x00004321)은 콜스택에 저장된다.

 

식별자가 가리키는 주소값은 모두 콜스택에 저장된다.

 

댓글