Javascript는 call by value 일까 call by reference 일까?

Ash·2022년 1월 22일
0

Today YJ Learned

목록 보기
7/10
post-thumbnail

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 value 라면?
    obj1은 { item: 'old' } 가 나와야한다!
  • call by reference 라면?
    obj2는 { item: 'new' } 가 나와야한다!

왜 이런 결과가 나왔을까?

이유는 자바스크립트는 인자를 전달할 때 값도, 주소 값도 아닌 주소 값의 복사본을 만들어서 넘기기 때문이다.

이 때문에 자바스크립트에서는 call by sharing 이라는 용어를 사용한다.



자바스크립트에서 함수의 매개변수로 객체를 넘기는 경우
"프로퍼티 값 변경은 가능, 객체 자체의 변경은 불가능하다." 는 점을 꼭 기억하자!

profile
기록남기기👩‍💻

0개의 댓글