오늘은 11장의 원시 그리고 객체 타입에 대해 알아보도록 한다.
자바스크립트의 다양한 데이터타입은 크게 원시 타입과 객체 타입으로 나뉜다.
먼저 원시 타입이란 변경이 불가능한 값이다. 이는 읽는 것만 가능한 값으로 변경할 수 없다. 변수가 주머니라면, 값은 메모리 공간을 차지하는 저장된 데이터 이다. 여기서 변경이 불가한 것은 변수가 가진 값을 의미한다.
const a = {}; //const 의 값은 재할당이 불가능하다.
var나 let과 같은 변수가 가진 값이 재할당 되면 값은 여전히 같은 메모리 공간을 차지하지만, var와 let이 가르키는 값과 주소가 바뀐다. 따라서 해당 변수들이 이전에 가지고 있던 값들은 여전히 존재하며, 변경이 불가하다.
(메모리 효율에 안좋을 듯 하다)
문자열은 원시 타입이다
문자열은 생성되면 변경할 수 없다.
let apple = 'hi';
apple = 'bye';
위의 코드가 실행되면 'hi'가 메모리에 저장이되고 변수인 apple은 'hi'가 있는 곳을 가르킨다. 하지만 아래의 'bye'가 재할당되면 apple은 'bye'가 있는 곳을 가르킨다. 여전히 메모리에는 'hi'과 'bye'가 존재한다.
let apple = 'hi';
apple[0]; // 'h'
for (let i of apple){
console.log(i);
} // 'h' 'i'
문자열은 유사 배열 객체로 인덱스 값으로 접근이 가능하다. for문으로 순회도 가능하다.
그렇다면 숫자는 어떨까?
let a = 10;
let b = a;
// b의 값은 a의 값과 같다.
a = 11;
console.log(b); //10
b 는 a의 원시 값을 복사하여 가지게 된다. 이를 '값에 의한 전달' 이라고 한다. a가 가진 10과 b가 가진 숫자값은 같으나, 서로 다른 메모리에 저장된 것이다. 따라서 a의 값을 변경해도 b의 값은 변하지 않는다. (자바스크립트 정말 좋은 언어...^^)
객체
객체는 변경 가능한 값이다.아래와 같이 원시값을 할당한 변수를 참조하면 메모리에 저장되어 있는 원시값에 접근할 수 있다.
var person = {
name : 'june';
};
//person 변수에 저장되어 있는 참조 값으로 객체(name:'june')에 접근할 수 있다.
person.name : 'bell';
person.address : 'newyork';
원시 값('june')은 변경 불가하나 객체 값은 변경 가능하다. 재할당 없이 프로퍼티를 동적으로 추가하거나 제거할 수 있다.
객체는 메모리 효율의 문제로 변경 가능한 값으로 만들어졌다. 하지만 여러개의 식별자가 하나의 객체를 공유할 수 있는 점이 단점으로 여겨지기도 한다.
var person = {
name : 'june';
};
var 인간 = person;
//참조 값을 복사함 (얕은 복사라고도 불리운다)
'인간'은 'person'의 참조 값을 복사해서 저장한다. 둘은 다른 메모리 주소를 가지지만 같은 참조 값 (값에 대한 주소)를 갖는다. 원본과 사본 중 어느 하나에서 객체를 변경하면 서로 영향을 준다. 이를 '공유에 의한 전달'이라고 표현한다.
*같은 집 열쇠를 복사하는 것과 같은것 같다. 같은 문을 열 수 있지만 다른 열쇠...? 도둑이 집 털어가면 이미 털린집 같은 느낌..?
Quiz
var june1 = {
favorite : 'netflix'
};
var june2 = {
favorite : 'netflix'
};
console.log(june1 === june2); //false
console.log(june1.favorite === june2.favorite); //true
june1과 june2는 다른 참조 값을 가지기 때문에 false 이다.
june1과 june2는 같은 원시 값 'netflix'로 평가되어 true이다.