변수, 함수등에 인자가 대입될 때, 인자를 어떤 방식으로 넘겨줄까?
let num = 10;
function modifyNum() {
num = 20;
return num;
}
console.log(modifyNum(num)); // 20
console.log(num); // 10
reference가 아닌 value로 전달되기 때문에 변경사항들은 함수 외부에서 발생하는 변수와 분리되고, 값을 변경해도 원본 값의 실제 참조는 변경되지 않는다.
let num = {first : 10};
function modifyNum() {
return num.first = 20;
}
console.log(modifyNum(num)); // 20
console.log(num); // 20
modifyNum 함수의 argument에 num을 전달하면 함수 외부 num의 참조값이 전달된다. 따라서 함수 내에서 num.first를 변경하면 외부의 값도 같이 바뀐다.
pass by value
. 사실 엄격하게 표현하면 변수에 값이 전달되는 것이 아니라 메모리 주소가 전달된다. 왜냐하면 변수네이밍(식별자)는 값이 아니라 메모리 주소를 기억하기 때문이다. pass by reference
객체를 생성하고 관리하는 방식은 복잡하며 비용이 많이드는 일이다. 왜냐하면 객체는 원시값처럼 크기가 일정하지도 않기 때문이다. 따라서 프로퍼티 값이 객체일 수도 있어서 deep copy 해서 생성하는 것은 비용이 많이 드는 일이며, 메모리 효율에 좋지 않다.
const example = {x : {y: 1}};
const example2 = {...example};
example.x === example2.x // true
example === example2 // false
const example = {x : {y: 1}};
const example2 = example;
example === example2 // true
const example = 3
const example2 = example;
example === example2 // true
값에 의한 전달 (pass by value)와 참조에 의한 전달(pass by reference)는 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달한다는 면에서 동일하다.
하지만 pass by reference는 두 개의 식별자가 하나의 객체를 공유하는 것에 더 가깝다. 왜냐하면 자바스크립트에는 포인터
가 존재 하지 않기 때문에 자바스크립트에는 pass by reference가 존재하지 않고, pass by value만 있다고 볼 수 있다.
출처 : 자바스크립트 Deep Dive