function change(a, b, c) {
a = 'a changed'
b = { b: 'changed' };
c.c = 'changed';
}
let a = 'a unchanged';
let b = { b: 'unchanged' };
let c = { c: 'unchanged' };
change(a, b, c);
console.log(a, b, c); // ?
내 예상은
a changed / {b: changed} / c: changed 즉 전부 바뀔거라 예상했다
그치만
a unchanged {b: 'unchanged'} {c: 'changed'}
c만 바뀌었고,
자바스크립트는 Call by Value 방식으로 매개변수를 전달
이는 함수 매개변수에 값의 복사본이 전달된다는 의미
a(문자열)
문자열 값의 복사본이 파라미터에 전달되어 함수 내에서 값이 변경되어도 호출한 곳의 변수엔 영향 미치지 않음
b(객체)
원본 객체의 참조 값(주소)의 복사본이 파라미터에 전달
그래서 객체를 새롭게 할당하면, 해당 복사본이 가리키는 참조 값이 새로운 객체의 참조 값으로 변경됨
이로 인해 함수 내의 복사본 b는 참조값을 가리키긴하나, 함수 외부의 b는 여전히 유지됨
c(객체)
원본 객체의 참조 값의 복사본이 파라미터에 전달
함수 내부 외부의 변수가 모두 동일한 참조 값을 가리키고 있으므로, 함수 내부에서 객체의 속성을 변경하면 호출한 곳의 객체에도 영향을 미침
즉 c 객체의 속성을 변경한 것이므로 호출한 곳의 c객체는 변경됨