그동안 기본 개념을 배우면서 이해하려고 하면 붙잡고 늘어져서 안되는 것은 없었는데...
오늘은 붙잡고 늘어져도 이해가 안되는 문제가 발생했다.
바로 원시값과 참조값의 개념 설명을 보는와중에 애매모호한 설명에 빠져버려서...
원시값과 참조값의 개념인데 개념자체는 단순하다.
5가지 타입에 대해서는 값을 그대로 복사하고, 3가지 타입(객체, 배열, 함수)에 대해서는 값의 주소를 받아오는 것이다
따라서 이개념을 알면 서로다른 객체에서 같은 값을 가지고 있더라도 비교연산자 ===를 쓰면 FALSE가 나오는 것을 확인할수 있다
하지만 이걸 좀더 공부를 하면서 거기에 나온 예시가 있었는데 아래의 예시에서 var로 정의된 키워드 들이 각기 a,b여서 왜 값이 덮어지지 않는지... 어떤 이유가 있는지 내가 무엇을 잘못이해한건지 약 1시간 넘는 시간 동안 고뇌와 나는 빠간가... 라는 생각에 빠져있었다
그러다가 헬프데스크에 솔직하게 이런문제들에 대해서 여쭈어 보았고 매우 상세하게 답변을 해주신덕에 해소할수 있었다.
혼자공부했으면 오늘 열받아서 잠도못잤었을것 같다. 다시한번 닉네임 pig-cola님에게 감사를 ㅠㅡㅠ
function test(a, b){
a = 44;
b.name = "name changed to c";
}
var originalNum = 33;
var originalObj = {
name : "test object"
};
test(originalNum, originalObj);
// 함수가 될 때에 a라는 파라미터에는 originalNum의 원시값(33)이
// b라는 파라미터에는 originalObj의 참조값(오브젝트 그자체)이 들어가게 됩니다.
// 이때 함수 단락중 a = 44;라는것은 단지 받아온 전달인자의 값을 무시하고 44로 재할당 할 뿐이지
// 함수 밖에 있는 originalNum의 값을 변경하지는 못합니다.
// 하지만 b는 오브젝트 주소 자체를 받아오기때문에
// b에서 'name'이라는 키를 갖는 value에 "name changed to c"를 재할당 하게 됩니다. (즉 덮어씌우게 됩니다.)
// 그럼 오브젝트 자체에서 바뀐것 이기 때문에 외부에서도 역시 바뀌어 있는것 을 확인할 수 있습니다.
console.log(originalNum); // 33, Access By Value
console.log(originalObj); // { name: 'name changed to c' }, Access By Reference
'Dairy > Codestates' 카테고리의 다른 글
코드스테이츠 8주차 (0) | 2020.08.11 |
---|---|
6주차 슬슬 슬럼프의 시기 (0) | 2020.07.30 |
코드스테이츠 4주차 (0) | 2020.07.19 |
코드스테이츠 공부 3주차 (0) | 2020.07.10 |
코드스테이츠 개발 공부 2주차 (0) | 2020.07.01 |