REVIEW: PRIMITIVES, OBJECTS AND THE JAVASCRIPT ENGINE
PRIMITIVES <- PRIMITIVE TYPES (원시 타입)
- Number
- String
- Boolean
- Undefined
- Null
- symbol
- BigInt
OBJECTS <- REFERENCE TYPES (참조 타입)
- Object literal
- Arrays
- Functions
- Many more...
JS ENGINE
- CALL STACK: primitives are stored in call stack (execution context in which they are declared)
- HEAP: objects are stored in (memory) heap
PRIMITIVE VS. REFERENCE VALUES
// Primitive values example:
let age = 30;
let oldAge = age;
age = 31;
console.log(age); // 31
console.log(oldAge); // 30
// Reference value example:
const me = {
name: 'Sunny',
age: 35,
};
const friend = me;
friend.age = 27;
console.log('Friend:', friend); // Friend: {name: 'Sunny', age: 27}
console.log('Me', me); // Me {name: 'Sunny', age: 27}
Q. friend.age에 값을 27을 넣어준건대
왜 me의 age까지 본래 값인 35가 아닌 27이 콘솔에 찍히는걸까?
그 원리를 알아보자.
let age = 30;
age라는 이름의 Unique Identifier에게 certain address가 할당됨
여기서는 0001 주소라고 가정하자.
그리고 값인 30은 0001 주소에 저장이 된다.
참고로 이 모든건 call stack에서 일어나고 있는 일임!
여기서 중요한 건 identifier age는 value 30을 가리키는 것이 아님 ⭐️⭐️
0001일 주소를 가리키고 있음
즉, age = memorry address 0001 holds the value of 30
let oldAge = age;
oldAge라는 another identifier는 age의 주소인 0001을 가리키게 될거임
그래서 oldAge의 value는 30이 되는거임
age = 31;
0001에 있던 value 30이 바뀌는게 아님
새로운 주소 0002 주소에 value 31이 담기게 됨
그럼 age identifier는 (이전의 0001 주소가 아닌) 새로운 주소 0002를 가리키게 된다.
그래서 콘솔에 age를 찍었을 때 30이 아닌 31이 찍히는거임.
그럼 HEAP에서는 어떤 일이 일어날까?
const me = {
name: 'Sunny',
age: 35,
};
me라는 object를 생성하는 순간 heap에서는 D30F 주소에 value들이 저장됨
그럼 me는 이 D30F 주소를 가리키게 될까?
No, call stack의 새로운 주소인 0003을 가리키게 됨
이 0003 주소에서는 실제 me의 value가 담기는 것이 아님
heap에 me object value들이 실제로 저장돼있는 D3DF 주소 참조값을 가지게 됨
why? 아마도 object value들이 용량이 커서 call stack에 다 담기는 힘들듯.
heap은 almost unlimited memory pool
call stack에서는 실제로 heap에 어디에 있는지만 주소를 참조값으로 담아놓고, 필요할 때만 찾아쓰면 된다!
const friend = me;
friend.age = 27;
// No problem, because we're NOT changing the value at address 0003!
friend identifier는 me의 주소인 0003을 가리키게 됨
그래서 결국엔 여기서 me나 friend나 heap에 있는 동일한 object를 가리키게 되는거임
friend의 age를 바꾼다?
이말인 즉슨 D30F에 저장돼있는 age 35를 27로 바꾸게 되는거임
고로 me에서 direct로 D30F의 age를 바꾼적은 없지만,
결국 age가 변경된 값으로 출력이 되는거다.
const로 선언됐다고 해서 value를 못 바꾼다? 그건 오해임
오직 primitive value일 때만 해당하는 얘기!
'Programming > JavaScript' 카테고리의 다른 글
Primitives vs. Objects in Practice (0) | 2022.11.23 |
---|---|
Regular Functions vs. Arrow Functions (0) | 2022.11.21 |
The this Keyword (0) | 2022.11.21 |
The this Keyword in Practice (0) | 2022.11.21 |
Variable Environment: Hoisting and The TDZ (0) | 2022.11.20 |