함수에서 인자를 호출하는 방식에 관한 내용이다
call by value
call by reference
파라미터를 원시타입으로 넣을 경우
call by value
객체 형태의 경우
call by reference
이렇게 이해를 했다
const a = { hi: 'hi', name: 'name' }
const callByReference = (obj) => {
obj.name = '';
return obj;
}
const result = callByReference(a)
>> { hi: 'hi', name: '' }
a
>> { hi: 'hi', name: '' }
result === a
>> true
const b = 'hi'
const callByValue = (str) => {
str = 'bye'
return str
}
const result = callByValue(b)
>> 'bye'
b
>> 'hi'
result === b
>> false
callByReference라는 함수에서는 Object형태의 값을 파라미터로 사용한 케이스이고
callByValue라는 함수는 원시타입을 파라미터로 사용한 케이스이다
callByReference의 경우 주소값이 동일하기에
비교를 해보면 true가 나오는 것을 확인할 수 있다
반면에 callByValue라는 함수를 보면
주소값을 복사해서 할당하는 것이 아닌 새로운 주소에 재할당을 한다고 생각하면 된다
그렇기에 비교를 해보면 false가 나오는 것을 확인할 수 있다
깊은 복사와 얕은 복사와 같은 개념이구나 생각했다
계속 찾아보면서 느낀건 자바스크립트는 기존의 언어와는 다른 방식이구나 라고 생각이 들었고
그 이유는 자바스크립트에서는 callByReference
가 아닌 callBySharing
이라는 개념을 가지고 있다는 것이다
이전과 비슷한 예시를 보면
const c = { hi: 'hi', name: 'name' }
const callBySharing = (obj) => {
obj = { hi: 'hi' }
return obj
}
const result = callBySharing(c);
>> { hi: 'hi' }
c
>> { hi: 'hi', name: 'name' }
result === c
>> false
아까와 다른점은 재할당을 했느냐, 기존 값의 내부값을 변경했느냐 이다
callByReference로 동작을 했다면 c의 값이 { hi: 'hi' }가 나왔어야 한다
하지만 이렇게 동작하지 않는 다는 걸 확인할 수 있고
이렇게 찾아보다 나온 것이 callBySharing이다
기존의 참조방식과는 다른 참조 방식을 사용하는 것이다
아무튼 기존의 방식과는 다르기에 새로운 용어를 사용한다 정도로 이해하면 될 것 같다