기술면접을 보면서 javascript는 call by value, call by reference 중 어떤걸 사용하나요!? 비슷한 질문을 받은 적이 있다.
그리고 난 알게 되었다. . . 자바스크립트는 call by reference를 지원하지 않는다는 사실을..! (답변 틀렸다는 뜻)
그래서 잘 알아보기로 했다~
각각의 개념은 나름 대학교때 공부를 열심히 해서(?) 알고 있다.
는 값만 받아오는 것이다. 그러니까.. 뭐냐 deep copy의 반대말이 뭐지요? (- shallow copy라고 합니다.)
call by value로 받아온 값을 변경하면 딱 변경된 거기서만! 바뀐다
는 주소값 자체를 받아오는거. deep copy~
얘로 받아온 애를 수정하면~ 멀리 있는 애(처음 선언된 애부터 쭉 ~~)까지 다 값이 바뀐다. 아주 위험하면서도 쓸모가 있는 놈이다.
이제 내 뇌피셜 말고 진짜 공부를 해보자.
원시(primitive)형태의 값을 사용하는 경우를 이야기한다.
immutable - 불변한 값이라고 한다.
원본 값과 동일한 값을 복사해서 사용하는 개념.
그러니까~ 뇌피셜이 맞다. 복사한 값을 수정해도 원본에는 영향이 없다.
mutable(변할수있는) 값
값이 참조(reference)값이다. 그니까 주소값.
원시타입과 참조타입으로 구분할 수 있다.
원시타입
참조(객체)타입
자바스크립트는 원시타입 다섯개를 제외하고 모두 객체(참조)타입니다. 모두 참조값으로 처리한다...
잠시만요 그래서 면접관님이 "자바스크립트는 call by reference를 지원..하지 않습니다!" 라고 너무나도 유쾌상쾌통쾌하게 대답하셨다고요.
근데 이러면 자바스크립트 call by reference 되는거 아님..?....ㄱ= 기다려봐요
https://perfectacle.github.io/2017/10/30/js-014-call-by-value-vs-call-by-reference/
javascript는 call by sharing으로 설명할 수 있다.
var a = {};
var func = function(b) {
b.a = 1;
}
func(a);
console.log(a.a); // 1
var a = {};
var func = function(b) {
b = 1;
}
func(a);
console.log(a); // {} //참조타입을 넘겼는데 값이 변하지 않는다.
차이가 보이시나여?
자바스크립트는 참조 타입을 인자로 넘기면 참조값에 대한 복사본을 만들어서 넘긴다.
참조값을 넘기는 것이 아니다~!<<<<<<<=====
참조타입의 경우 call by reference 처럼 동작하는 것이지 call by reference로 동작하는 것이 아니다!!
var a = {};
var func = function(b) {
b= (b.a = 1);
b.b = 2;
}
func(a);
console.log(a); // {a:1}
var a = {};
var func = function(b) {
b = (b.a=1); // b에 다시 할당하는 순간 - 참조 끝!
b = (b.b=2); // 얘는 할당 안돼
}
func(a);
console.log(a); // {a:1}

자바스크립트는 call by sharing 방식으로 이해할 수 있다.
http://milooy.github.io/TIL/JavaScript/call-by-sharing.html#call-by-sharing
C도 마찬가지로 call by retefence를 지원하지 않는다.
주소값을 복사해서 넘겨준다. call by address라고 하는 것이 정확하다.
call by reference처럼 사용할 수 있어지는 것~~ >충격<