데이터를 담고 있는 것. 어떤 공간에 어떤 값을 저장하기 위한 이름을 가진 공간.
Javascript에서 변수를 선언하기 위해선 let 키워드를 사용함.
변수 이름은 마음대로 지정 가능함.
let a = 'apple'; // string 타입
let num = 123; // 숫자 123이 num라는 변수에 할당, number 타입
원시 타입의 데이터는 변수에 할당이 될 때 메모리 상에 고정된 크기로 저장이 되고 해당 변수가 원시 데이터 값을 보관한다.
원시 타입 자료형은 모두 변수 선언, 초기화, 할당 시 값이 저장된 메모리 영역에 직접적으로 접근한다.
즉, 변수에 새 값이 할당이 될 경우, 변수에 할당된 메모리 블럭에 저장된 값을 바로 변경한다.
원시형은 불변성을 띈다.
1. number
2. String
3. Boolean
4. null
5. undefined
6. symbol
Primitive type의 변수 복사
각 변수 간에 원시 타입 데이터를 복사할 경우, 데이터의 값이 복사된다.
var x = 100; // 변수 x를 위한 공간 생김
var y = x; // 변수 y를 위한 공간 생김, x의 공간을 차지하지 않음
x = 99;
console.log(y); // 100;
데이터의 값을 복사하기 때문에 console을 찍기 전, x를 99로 바뀌었지만 이전의 값인 100을 복사해두었기 때문에 100이 찍힘.
Object 타입은 객체 타입으로 원시형 타입과 다르게 객체형은 다양한 데이터를 담을 수가 있다.
객체는 아래처럼 key:value를 한 쌍으로 가지는 속성을 뜻하는 property를 가진다.
그리고 object에 있는 각각의 키 마다 메모리가 할당된다. 그리고 이들을 묶어서 가리키는 주소만 변수에 할당된다.
값이 담긴 주소값들로 이루어진 묶음을 가리키는 주소값을 복제한다.
데이터 영역에 저장된 값은 불변값이지만, 객체의 프로퍼티 영역은 얼마든지 다른 값을 대입할 수 있기에 가변값이라고 한다.
let obj = {
name:'kim',
age: 29
}
// obj 변수에 주소를 할당.
let obj2 = obj
// obj2에 obj의 주소를 복사
console.log(obj2.name); // -> kim 이 출력됨.
obj.name = 'park';
// name 값을 변경
console.log(obj2.name); // -> park이 출력됨,
const는 변수를 상수로 선언하는 것.
하지만 object는 프로퍼티를 얼마든지 변경 가능하다.
그렇다면 object를 const로 선언한다면?
// const로 선언하면 이 obj 변수에 할당된 레퍼런스 공간은 잠겨버림. 즉, 이 레퍼런스를 변경하는건 불가능
const obj = {
name:'kim',
age:29
}
obj = {
name: 'park',
age:28
} // 에러 발생
// 하지만 obj 레퍼런스 안의 name의 값을 바꾸는 것은 가능.
// obj 변수의 레퍼런스 공간은 잠겨있지만 그 레퍼런스가 가리키는 것을 이용해 key들의 값은 변경 가능.
obj.name = 'park';