[Javascript] primitive type vs. reference type

JJeong·2021년 5월 17일
0

현상

두 객체의 동일성 여부를 판단하게 되었다. 그런데 a === {x:0, y:1}이라고 할 때, a가 {x:0, y:1}이어도 해당 조건문은 true가 되지 않았다. string type과는 다른 결과였다.

원인

원시 타입과 참조 타입은 데이터가 저장되는 방식이 다르다. javascript에서 원시 타입은 string, number, bigint, boolean, undefined, symbol이 있고 그 외의 나머지 타입은 참조 타입이다. 원시 타입은 변수와 짝이 지어진 메모리에 값(value)가 저장되어 있지만, 참조 타입은 해시 함수로 만들어진 주소값이 저장되어 있다. 따라서 일치 연산자로 값을 비교해보면 원시 타입은 true, 참조 타입은 false로 나온다. 객체나 배열이 저장되어 있는 주소는 서로 다르기 때문이다.

이를 고려하면 얕은 복사(Shllow Copy)와 깊은 복사(Deep Copy)도 쉽게 이해할 수 있다. 깊은 복사는 복사된 변수에 할당된 값이 새로운 주소에 저장된다. 원시 타입은 기본적으로 깊은 복사가 진행된다. 얕은 복사는 복사한 변수가 기존 값이 저장된 주소를 그대로 가리키는 경우를 말한다. 사실상 하나의 데이터를 공유하는 것이므로 하나를 수정해도 원본, 복사본 모두 변한다. 참조 타입이 이에 해당된다. 따라서 참조 타입을 깊은 복사로 진행하기 위해서는 재귀 함수나 ladash 등 라이브러리를 사용해야 한다.

0개의 댓글