데이터 구조의 종류
- 기본형(Primitive Type) : Number, String, Boolean, null, undefined
값을 메모리에 그대로 할당
- 참조형(Reference Type) : Object
값이 저장된 주소값을 할당(참조)
두개의 차이를 알아보자
var a;
- 변수를 선언시 메모리에 변수가 담길 공간 확보 -> @413
- 확보된 공간의 주소값을 변수명과 매칭
var a;
a = 10;
- a라는 변수에 특정 값이 입력되면 a라는 변수명이 선언되었는지 확인후 없으면 1번과정을 실행하고 있으면 변수명과 매칭된 주소값(@413)을 찾아가 데이터 10을 입력
var a;
a = 10;
var b = a;
- 1번과 2번의 과정을 진행하고 b라는 변수의 주소값(@414)에 10을 입력
var a;
a = 10;
var b = a;
b = false;
- 이때 기본형 데이터의 경우 서로 다른 변수의 비교가 바로되기때문에 변수 b에 새로운 값을 할당하면 a와 b는 서로 다른 값이됨 (a !== b)
var obj = {
a: 1,
b: 'b'
}
- 변수를 선언시 메모리에 변수가 담길 공간 확보 -> @413
- 확보된 공간의 주소값을 변수명과 매칭
- 할당할 변수가 참조형 데이터의 경우 obj 안에 있는 값들의 주소정보를 저장할 공간 확보 -> @1011
- a의 값을 저장할 공간을 확보 -> @1012
- 그 주소를 3번의 주소정보를 저장할 공간(@1011)에 입력
- b의 값을 저장할 공간을 확보 -> @1013
- 주소를 3번의 주소정보를 저장할 공간(@1011)에 입력
- 각각의 주소정보에 해당하는 공간(@1012, @1013)에 각각의 값을 입력
- 3번의 주소정보를 저장할 공간의 주소(@1011)를 1번에서 확보한 공간(@413)에 입력
var obj = {
a: 1,
b: 'b'
}
var obj2 = obj;
- 1번과 2번 과정을 진행하고 -> @414
- 3번의 주소정보를 저장한 공간(@1011)의 주소값을 1번에서 확보한 공간(@414)에 입력
obj2.a = 10;
console.log(obj2.a);
console.log(obj.a);
- obj2 의 property 인 a의 값을 10으로 변경시 obj와 obj2 가 같은 주소(@1011)을 가르키고 있기때문에 같은 값이 찍힘 (obj === obj2)
- 참조형 데이터 안에 또다른 참조형 데이터가 있을 경우(nested)
var obj3 = {
a: [4, 5, 6]
}
- 변수를 선언시 메모리에 변수가 담길 공간 확보 -> @547
- 확보된 공간의 주소값을 변수명과 매칭
- 할당할 변수가 참조형 데이터의 경우 obj 안에 있는 값들의 주소정보를 저장할 공간 확보 -> @1184
- a의 값을 저장할 공간을 확보 -> @1185
- @1185를 @1184에 입력
- @1185에 데이터를 입력해야하나 데이터를 확인해보니 참조형데이터이기때문에 4, 5, 6 에 대한 공간확보(@1326, @1327, @1328)
- @1326, @1327, @1328를 @1185에 맵핑
- @1326, @1327, @1328에 해당하는 값 4, 5, 6을 각각 입력
- 모든 객체에 대하여 맵핑완료후 @547에 @1184주소를 입력
var obj3 = {
a: [4, 5, 6]
}
obj3.a = 'new';
- property a 에 새로운 문자열 new 를 할당하게 되면 @1185 공간에 'new'를 입력하고 기존@1185에 가지고 있던 주소정보들(@1326, @1327, @1328)이 사라진다.
- 사라진 주소에 있던 값들 (4, 5, 6)은 링크가 사라지게 되고 가비지콜랙터에 의해 추후에 삭제된다.