Q. 함수 매개변수 전달과정에서 javascript는 call by value로 동작하는가? call by reference로 동작하는가?
A. 정답부터 말하자면 둘 다 아니다!
설명에 앞서 예제부터 살펴보자!
var str = 'old';
var value = false;
var num = 0;
var obj1 = {
item: 'old'
};
var obj2 = {
item: 'old'
};
var obj3 = {
item: 'old'
};
function test({str, value, num, obj1, obj2, obj3}) {
str = 'new';
value = true;
num = 1;
obj1.item = 'new';
obj2 = {
item: 'new'
}
obj3.item2 = 'new';
}
test({str, value, num, obj1, obj2, obj3});
console.log(str); // old
console.log(value); // false
console.log(num); // 0
console.log(obj1); // { item: 'new' }
console.log(obj2);// { item: 'old' }
console.log(obj3);// { item: 'old', item2: 'new'}
Primitive Type의 경우 항상 call by value로 동작한다.
그런데 객체의 경우 이상하다!
왜 이런 결과가 나왔을까?
이유는 자바스크립트는 인자를 전달할 때 값도, 주소 값도 아닌 주소 값의 복사본을 만들어서 넘기기 때문이다.
이 때문에 자바스크립트에서는 call by sharing 이라는 용어를 사용한다.
자바스크립트에서 함수의 매개변수로 객체를 넘기는 경우
"프로퍼티 값 변경은 가능, 객체 자체의 변경은 불가능하다." 는 점을 꼭 기억하자!