데이터 타입은 크게 원시 타입
과 객체 타입
으로 나누어진다.
종류(6개): 숫자
,문자열
,불리언
, undefined
, null
, 심벌
특징:
요약:
종류(1개): 객체
특징:
요약:
위에서도 설명했지만, 원시 값은 변경 불가능
하다.
살짝 햇갈릴수도 있는 부분은, 변수에 원시 값이 할당되면, 변수라는 의미가 퇴색되는 것이 아닌가? 라는 부분이다.
이는 개념을 잘못 접근해서 그런데, 변수가 변경 불가능하다는 것이 아닌, 값 자체가 변경 불가능하다는 뜻이다.
따라서, 변수는 재할당을 통해 다른 주소에 새로운 값을 할당해 불러올 수 있다.
문자열은 원시 타입에 속해있다.
그런데 여기서 문제는 문자열은 문자열의 길이에 따라 메모리 공간의 크기도 달라진다는 점이다.
JavaScript는 이를 해결하기 위해, 문자열이 저장된 메모리 공간의 첫 번째 메모리 셀 주소를 기준으로 문자열을 다룬다.
문자열도 다른 원시 타입과 마찬가지로, 문자열이 조금이라도 변경되면 새로운 메모리 공간에 변경된 문자열을 저장시킨다.
가비지 컬렉터
: 자바스크립트에서는 더 이상 참조되지 않는 값들은 가비지 컬렉터의 의해 적절한 시점에 메모리에서 자동 해제된다.
이러한 가비지 컬렉터의 장, 단점은 다음과 같다.
.
장점: 개발자가 수동적으로 메모리를 삭제하지 않아도 된다.
단점: 적절한 시점은 자바스크립트 마음대로 정해지며, 수동적으로 메모리를 해제할 수 없다.(장점이지만 단점도 됨)
객체는 프로퍼티의 개수가 정해져있지 않다.
이 말은, 프로퍼티를 동적으로 추가, 삭제, 변경이 가능하다는 뜻이다.
또한, 객체는 변경 가능한 값
이라는 특징을 가지고 있기 때문에,
기존의 원시값처럼 재할당을 하지 않고도 객체를 직접 변경 가능하다.
=> 메모리에 저장되어 있는 참조 값을 통해 실제 객체에 접근할 수 있다.
하지만, 이러한 구조는 부작용도 가지고 있다. 참조 값을 통해 접근하다보니, 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 점이다.
const person = {
name: 'oseung'
}
const person1 = person; // person 객체 복사
console.log(person1.name) // 'oseung'
person.name = 'jamong'; // person.name을 'jamong'으로 업데이트
// person.name이 변경되면, pserson1.name도 변경됨.
console.log(person1.name) // 'jamong'