How passing arguments works : value vs reference

Juyeon Lee·2022년 2월 16일
0

자바스크립트는 기본적으로 pass by value 방식을 사용하는 언어다. 이 방식은 함수에 인자를 전달할 때, 값 자체를 복사하여 전달하는 것을 의미한다. 반면, pass by reference는 변수의 실제 참조를 전달하기 때문에 함수 내에서 값이 변경되면 원본 값에도 영향을 미친다. 이 두 가지 방식의 차이점을 이해하기 위해 다음의 코드를 살펴보자.

const flight = 'LH234';
const lingling = {
  name: 'lingling Lee',
  passport: 2343254667,
};

const checkIn = function (flightNum, Passenger) {
  flightNum = 'Lh999';
  Passenger.name = 'Mrs.' + Passenger.name;

  if (Passenger.passport === 2343254667) {
    alert('Check in');
  } else {
    alert('Wrong passport!');
  }
};

checkIn(flight, lingling);
console.log(flight);//LH234
console.log(lingling);//{name: 'Mrs.lingling Lee', passport: 2343254667}

위의 코드에서 flight는 문자열이라는 원시 데이터 타입으로, flightNum에 복사된다. 함수 내에서 flightNum을 'Lh999'로 변경하더라도 원본 flight 값은 영향을 받지 않으며, console.log(flight);는 여전히 'LH234'를 출력한다.

반면, lingling 객체는 참조 데이터 타입으로, Passenger 매개변수에 대한 참조(주소)가 복사된다. 함수 내에서 Passenger.name을 'Mrs.' + Passenger.name으로 변경하면, 이 참조를 통해 원본 lingling 객체의 name 속성도 변경된다. 결과적으로 console.log(lingling);는 {name: 'Mrs. lingling Lee', passport: 2343254667}를 출력하게 된다.

이처럼, 자바스크립트는 원시 데이터 타입에 대해서는 값 자체를 복사하여 전달하며, 객체와 같은 참조 데이터 타입에 대해서는 참조를 복사하여 전달한다. 따라서 객체의 경우, 함수 내에서 속성을 변경하면 원본 객체에도 영향을 미치는 것을 확인할 수 있다.

아래는 내가 읽고 이해한 영어 설명이다.

  • When we pass a primitive type as an argument on a function, the function makes a copy of the ORIGINAL VALUE and works with it.

  • On the other hand, when we pass an object as an argument on a function, the function makes a copy of the REFERENCE that points to the place of the memory where the object is stored. This copy is a value itself, is not a reference. Because of all of this, the original object can be modified from the inside of a function.

string같은 primitive 타입은 원래의 original value를 카피하지만 object같은 reference type은 heap에 저장되어있는 주소를 카피하는거라 이렇게 카피한 상태에서 내용을 바꾸면 heap에 저장되어있는 object 자체가 변화하는것이다.

  • When we pass an object, the function works with a value, which is a copy of the reference that address to the spot in the memory where the original object is in the memory (still is not a reference).
  • Passing an object: Function makes copy of the memory address in the heap which contains the object itself, but it does NOT make copy of object. We just pass the value, which in this case happens to be the memory address, and our local function parameter goes there and changes it. Since it's changed at the memory which was accessed by the original identifier in our call stack as well, changes are reflected.

0개의 댓글