모던 자바스크립트 딥다이브 책의 내용을 기반으로 작성하였습니다.🌿
C나 Java의 경우 정수(소수점 이하 없는 숫자)와 실수(소수점 이하 있는 숫자) 구분이 가능한 다양한 숫자 타입을 제공한다. 하지만 자바스크립트는 모든 수를 실수로 처리하며, 정수를 위한 데이터 타입이 존재하지 않는다.
다음과 같은 특별한 값도 표현 가능하다.
console.log(10 / 0) // Infinity
console.log(10 / -0) // -Infinity
console.log(1 * 'string') //NaN
문자열은 0개 이상의 16비트 유니코드 문자(UTF-16)의 집합으로 전 세계 대부분의 문자를 표현할 수 있다.
작은 따옴표(''), 큰 따옴표("") 또는 백틱(``)으로 감싸서 표현 가능하다.
var string = '문자열';
자바스크립트의 문자열은 원시 타입이며, 변경 불가능한 값(immutable value)이다.
ES6에 도입된 템플릿 리터럴은 백틱을 사용해 표기하며, 멀티라인 문자열 / 표현식 삽입 / 태그드 템플릿 등 편리한 문자열 기능을 제공한다.
var template = `<ul>
<li><a href="#">Home</a></li>
</ul>`
var first = 'Enna';
var last = 'Kim';
console.log(`My name is ${first} ${last}.`) // My name is Enna Kim.
console.log(`1 + 2 = ${1 + 2}`) // 1 + 2 = 3
논리적 참과 거짓을 나타내는 true, false 값
var foo = true;
console.log(foo); //true
foo = false;
console.log(foo); //false
변수를 선언하면 암묵적으로 undefined로 초기화 된다. 따라서 값을 할당하지 않은 변수를 참조하면 undefined가 반환된다. undefined는 개발자가 의도적으로 할당하기 위한 값이 아니라, 자바스크립트 엔진이 변수를 초기화할 때 사용되는 값이다. 따라서 개발자가 의도적으로 undefined 값을 할당하는 것은 본래 취지와 어긋나므로 권장되지 않는다.
null 타입은 변수에 값이 없다는 것을 의도적으로 명시할 때 사용한다. null을 할당하는 것은 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이며, 자바스크립트 엔진은 참조되지 않는 메모리 공간에 대해 가비지 콜렉터를 수행하게 된다.
또한 함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 한다.
ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값이다. 또한 다른 값과 중복되지 않는 유일무이한 값이다.
Symbol
함수를 호출해 생성하며, 생성된 심벌 값은 외부에 노출되지 않는다.
var key = Symbol('key');
console.log(typeof key); // symbol
(33장에서 자세히-)
💡 자바스크립트의 데이터 타입은 크게 원시 타입과 객체 타입으로 분류된다. 자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것이 객체라는 사실을 기억하자.
(객체 타입에 대해선 11장에서 자세히 살펴볼 예정)
자바스크립트 엔진은 데이터 타입에 따라 정해진 크기의 메모리 공간을 확보한다.
예를들어, 숫자 100을 2진수로 저장한다고 했을 때 자바스크립트 엔진은 8바이트의 메모리 공간을 확보하고 저장한다.
반대로 이 값을 참조할 경우, 식별자를 통해 숫자 타입의 값 100이 저장되어 있는 메모리 공간의 선두 메모리셀의 주소를 찾아가 8바이트만큼 읽어오게 된다.
이처럼 값을 참조하기 위해 한번에 읽어 들여야 할 메모리 공간의 크기(메모리셀의 개수)를 알아야 한다.
또한 메모리에서 읽어들인 2진수를 데이터 타입에 따라 다르게 해석될 수 있다.
예를들어 저장된 값 0100 0001을 숫자로 해석하면 65이지만 문자열로 해석하면 'A'이다.
데이터 타입이 필요한 이유
- 저장 시 메모리 공간의 크기를 결정하기 위해
- 값 참조 시 읽어들일 메모리 공간의 크기를 결정하기 위해
- 2진수를 어떻게 해석할지 결정하기 위해
C나 자바같은 언어는 변수 선언 시 데이터 타입을 선언해야 하는 정적 타입 언어이다. 정적 타입 언어는 컴파일 시점에 타입 체크를 수행하는데, 만약 타입 체크를 통과하지 못하면 에러를 발생시킨다. 자바스크립트는 이와 다르게 변수 선언 시 타입을 선언하지 않으며 어떤 데이터 타입의 값이라도 자유롭게 할당이 가능하다.
즉, 정적 타입 언어는 변수 선언 시점에 타입이 결정되고 변수의 타입을 결정할 수 없다. 반면에 자바스크립트는 값을 할당하는 시점에 변수의 타입이 동적으로 결정되고 변수의 타입을 언제든지 변경할 수 있다.
다시 말해, 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)되며 재할당에 의해 변수의 타입은 언제든지 동적으로 변경 될 수 있다. 이러한 특징을 동적 타이핑(dynamic typing)이라고 한다.
자바스크립트와 같은 동적 타입 언어는 유연성은 높지만 신뢰성은 떨어져 안정적인 프로그램 개발을 위해 주의해야 할 사항이 있다.
- 오류 발생 가능성을 낮추기 위해 변수는 필요한 만큼 최소한으로 유지할 것
- 변수의 스코프는 최대한 좁게 만들 것
- 전역 변수는 최대한 사용하지 않을 것
- 변수보다는 상수(const)를 사용할 것
- 변수 네이밍은 목적과 의미에 맞게 할 것