자바스크립트는 기본적으로 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 자체가 변화하는것이다.