값 vs 레퍼런스
(Yon don't know JS 참조)
예를 들면
var a = 2;
var b = a;
b++;
a; // 2
b; // 3
var c = [1,2,3];
var d = c; // 'd' 는 공유된 '[1,2,3]'값의 레퍼런스다.
d.push(4);
c; // [1,2,3,4];
d; // [1,2,3,4];
c와 d는 모두 합성 값이자 동일한 공유 값 [1,2,3] 에 대한 개별 레퍼런스다. 여기서 기억해야 할 점은 c와 d가 [1,2,3]을
'소유' 하는 것이 아니라 단지 이 값을 동등하게 참조만 한다는 사실이다. 따라서 레퍼런스로 실제 공유한 배열 값이 변경되면(.push(4))
이 공유한 배열 값에만 영향을 미치므로 두 레퍼런스는 갱신된 값 [1,2,3,4]를 동시에 바라본다.
코드골프 코드를 분석하면서 확인한 것이
dst 란 변수에 2차원 배열을 선언하고, 이 후 dst의 한 row를 dstRow 란 변수에 할당하고 있었다. 그리고 알고리즘의 수행값을
dstRow에 넣어주며 갱신을 해주었다. 마지막에 반환을 할 때는 dstRow가 아닌 dst만을 반환해주어 값은 dstRow에 갱신해주는데 반환은 dst를 해주어 약간 의아스러웠다.
디버깅을 해보니 dstRow의 값이 변경될때 dst의 값도 같이 변경되는 것을 알 수 있었다.
이러한 동시 변경의 원리가 레퍼런스는 변수가 아닌 값 자체를 가리키기 때문이란 것을 책을 통해 알 수 있었다.
조금 헷갈렸다, dst 와 dstRow도 배열 값이고 dstRow 배열 값이 바뀜에 따라 dst도 바뀌는데 책에선 그렇게 설명이 안되어있는데? (P61)
생각해보건데,
var a = [1,2,3];
var b = a;
b = [4,5,6];
a // [1,2,3];
b // [4,5,6];
과 같이 되는 것은 b 레퍼런스가 가리키는 대상자체가 바뀌었던 것이고,
내가 의문을 가진 위 부분은 2차원 배열의 한 요소 값(배열 값)이 변경되면 이를 공유하는 다른 레퍼런스 또한 변하게 되는 것이 차이점 이라 이해를 하게 되었다.
'Languages > Javascript' 카테고리의 다른 글
datatables 관련 자료 (0) | 2024.04.20 |
---|---|
datatables 관련 자료 (0) | 2024.04.17 |
Carousel Slider 제작 과정 (0) | 2020.07.11 |
JS의 비동기 동작에 관한 글 (0) | 2020.01.31 |
thisArg 에 대한 이해 (feat. filter 메소드) (2) | 2019.11.23 |
댓글