데이터를 담는 변수는 식별자
와 데이터
부분으로 나뉜다.
let a = 3; // 식별자 : a , 데이터 : 3
변수는 메모리에 변수 영역
과 데이터 영역
으로 나뉘어 저장된다.
원시형 | 참조형 |
---|---|
Number(숫자), String(문자열) | Array(배열), Object(객체) |
: 변수 영역과 데이터 영역을 가진다.
let a = 3;
원시형의 데이터 구조
변수 영역
주소 | 1001 | 1002 | ... |
데이터 | a/@5002 | ... |
데이터 영역
주소 | 5001 | 5002 | ... |
데이터 | 3 | ... |
: 변수 영역과 데이터 영역을 가지며, 해당 식별자의 데이터 영역을 별도로 가진다.
let obj = {a: 3, b: "aaa"}
참조형의 데이터 구조
변수 영역
주소 | 1001 | 1002 | ... |
데이터 | obj/@7104~ | ... |
obj 데이터 영역
주소 | 7104 | 7105 | ... |
데이터 | a/@5001 | b/@5002 | ... |
데이터 영역
주소 | 5001 | 5002 | ... |
데이터 | 3 | "bbb" | ... |
변수의 복사는 주소값
을 복사한다.
// 선언
let a = 10;
let obj1 = {c: 10, d: "ddd"};
// 복사
let b = a;
let obj2 = obj1;
// 값 변경
b = 15;
obj2.c = 20;
obj2.d = "aaa";
let a = 10;
let obj1 = {c: 10, d: "ddd"};
변수 영역
주소 | 1001 | 1002 | 1003 | 1004 | ... |
데이터 | a/@5001 | obj1/@7103~ | ... |
obj1 데이터 영역
주소 | 7103 | 7104 | ... |
데이터 | c/@5001 | d/@5002 | ... |
데이터 영역
주소 | 5001 | 5002 | 5003 | 5004 | 5005 |
데이터 | 10 | "ddd" |
let b = a;
let obj2 = obj1;
변수 영역
주소 | 1001 | 1002 | 1003 | 1004 | ... |
데이터 | a/@5001 | obj1/@7103~ | b/@5001 | obj2/@7103~ | ... |
obj1 데이터 영역
주소 | 7103 | 7104 | ... |
데이터 | c/@5001 | d/@5002 | ... |
데이터 영역
주소 | 5001 | 5002 | 5003 | 5004 | 5005 |
데이터 | 10 | "ddd" |
b = 15;
obj2.c = 20;
obj2.d = "aaa";
변수 영역
주소 | 1001 | 1002 | 1003 | 1004 | ... |
데이터 | a/@5001 | obj1/@7103~ | b/@5003 | obj2/@8204~ | ... |
obj1 데이터 영역
주소 | 7103 | 7104 | ... |
데이터 | c/@5004 | d/@5002 | ... |
obj2 데이터 영역
주소 | 8204 | 8205 | ... |
데이터 | c/@5004 | d/@5005 | ... |
데이터 영역
주소 | 5001 | 5002 | 5003 | 5004 | 5005 |
데이터 | 10 | "ddd" | 15 | 20 | "aaa" |
복사 후 값을 변경했을 때,
원시형 데이터를 가진 a와 b는 a !== b가 되지만,
참조형 데이터를 가진 obj1과 obj2는 obj1 === obj2가 된다.
변수의 복사는 값이 아닌 주소의 복사로 이루어지기 때문이다.
참조형을 문제 없이 복사할 수 있는 방법
: JSON을 활용하여 문자열화(stringify) 한 뒤 다시 JSON화(parse) 한다.let obj3 = JSON.parse(JSON.stringify(obj1));