기본형(원시형) 데이터
- 숫자, 문자열, 불리언, null, undefind 등
- 불변성을 갖는 데이터
참조형 데이터
- 객체, 배열, 함수, 날짜, 정규식 등
- 가변성을 갖는 데이터
가변성과 불변성이란 무엇일까?
var a = 2
a = 4
이러면 값이 2에서 4로 변경될텐데, 그럼 이것도 변하는 데이터 아닌가?
데이터의 불변성 여부는 데이터 영역 메모리의 변경 가능성으로 판단한다.
컴퓨터의 모든 데이터는 바이트 단위의 식별자, 메모리 주소값을 통해 서로를 구분하고 연결할 수 있다
식별자 = 변수명
어떠한 데이터를 식별하는 데 사용하는 이름
변수
변할 수 있는 값(데이터)
변수를 선언하고 할당하는 과정에서 메모리 영역은 어떤 작업을 수행하는지 간단하게 정리해봤다.
var a = 2선언과 할당
a = 4재할당
분명 a의 값은 2에서 4로 바뀌었지만 참조하는 값이 변경되었을 뿐, 기존 데이터를 수정하지 않고 새 값을 생성했기 때문에 불변성을 가져 기본형 데이터라고 한다. (숫자, 문자열, null 등등)
그럼 참조형 데이터는 어떨까?
객체의 선언과 할당
var obj = { a : 1, b : "b" };
obj.a = 2재할당
재할당 후에도 obj가 참조하는 값은 데이터3 그대로이다. 결과적으론 데이터3의 값이 변경되었다는 것과 같은 뜻이라 가변성을 가져 참조형 데이터라고 한다.
기본형 데이터 복사
var a= 10
var b = a
기본형 데이터의 경우 참조하는 값을 복사한다.
a = 20재할당을 하면 어떻게 될까?
a = 20,b = 10,a !== b
기본형 데이터의 복사는 이렇게 이루어진다.
참조형 데이터 복사
var obj1 = { a: 1, b: "b" }
var obj2 = obj1
참조형 데이터도 기본형과 같이 참조하는 값을 복사한다.
obj1.a = 2재할당을 하면 어떻게 될까?
기본형 데이터와 다르게 참조하는 값은 동일하나 참조하고 있는 값의 내부에서 값이 변경된다.
obj1 = {a: 2, b: "b"},obj2 = {a: 2, b: "b"}
obj1 === obj2
참조형 데이터의 복사는 이렇게 이루어진다.
다만 위 예시의 obj1.a = 2 처럼 내부 프로퍼티를 변경하는 게 아닌, obj1 = {a: 2, b: "b"} 과 같이 변수(obj1)의 값을 직접 변경하는 경우 참조형 데이터임에도 참조하는 값이 변경된다.
이를 통해 참조형 데이터의 가변성은 변수의 값 자체를 변경하는 게 아닌, 내부 프로퍼티를 변경할 때에만 적용된다는 것을 알 수 있다.