데이터 타입(data type)은 값의 종류를 말한다. 자바스크립트의 데이터 타입은 원시 타입과 객체 타입으로 분류할 수 있다.
원시타입
- 숫자, 문자열, 불리언, undefined, null, 심벌 타입
객체 타입
- 객체, 함수, 배열 등
그럼 자바스크립트가 제공하는 데이터 타입의 특징을 살펴보자
숫자 타입은 추가적으로 세가지의 특별한 값도 표현한다.
- Infinity : 양의 무한대
- -Infinity : 음의 무한대
- NaN : 산술 연산 불가 (not a number)
(+ 대소문자를 구분하므로 NaN으로 표기해야함, nan 등등은 xx)
문자열 타입은 텍스트 데이터를 나타내는데 사용된다. 작은따옴표(''), 큰따옴표(""), 백틱(``)으로 텍스트를 감싼다.
자바스크립트 문자열은 원시 타입이며 변결 불가능한 값이다. 이는 문자열이 생성되면 변경할 수 없다는 것을 의미한다. (관련해서는 11장 참고)
템플릿 리터럴은 백틱(``)을 사용해 표현하는 것으로 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공한다. 이는 런타임에 일반 문자열로 변환되어 처리된다.
// 일반 문자열에서 개행하려면 이스케이프 시퀀스를 이용해야하지만
console.log("hello\nwordl");
// 템플릿 리터럴은 이스케이프 시퀀스 없이도 개행할 수 있다
console.log(`hello
world`);
// 템플릿 리터럴 내에서는 표현식 삽입을 통해 문자열을 삽입할 수 있다
var first = "hi";
console.log(`hoho.. ${first}`); //ES6
true
false
undefined 타입의 값은 undefined가 유일하다.
자바스크립트 엔진은 변수 선언에 의해 확보된 메모리 공간에 처음 할당이 이루어지지 않았다면 undefined로 초기화한다. 때문에 아래와 같이 개발자가 의도적으로 undefined를 할당하면 혼란을 줄 수 있으므로 권장하지 않는다.
var foo = undefined; (XXXXXXX!!!!)
var hoo = null; (OOOOOOOO ^O^)
null 타입의 값은 null이 유일하다.
변수에 값이 없다는 것을 의도적으로 명시할 때 사용한다. 함수가 유효한 값을 반환할 수 없을 때도 명시적으로 null을 반환하기도 한다.
ES6에 추가된 타입으로, 변경 불가능한 원시 타입의 값이다.
심벌은 Symbol 함수를 호출해 생성하는데, 이때 생성된 값은 외부에 노출되지 않고 중복되지 않는 유일무이한 값이다. 더 자세하게 알아보기(7장)
C 등과 같은 정적 타입 언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있다. 때문에 컴파일 시점에 타입 체크를 수행하고 통과하지 못했다면 에러를 발생시킨다.
그러나 자바스크립트는 변수를 선언할 때 타입을 선언하지 않고 var, let, const 키워드를 사용해 변수를 선언한다. 또한, 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.
즉, 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)된며 재할당에 의해 변수의 타입은 언제든지 동적을 변할 수 있는 동적 타이핑이라는 특징을 가지고 있다.
그렇다면 변수는 타입을 가질까? 답은 NO.
하지만 값은 타입을 가지므로, 변수에 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정되는 것이다.
변수를 사용할 때 주의사항
- 변수는 꼭 필요한 경우에 한해 제한적으로 사용하기
(자바스크립트 엔진에 의해 암묵적으로 타입이 변환되기도 하니까... 유연성은 높지만 신뢰성은 낮은 동적 타입 언어!)- 변수의 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용을 억제하기
- 전역 변수는 최대한 사용하지 않기
- 변수보다는 상수를 사용해 값의 변경을 억제하기
- 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍하기
자바스크립트 타입에 대해 알 수 있어서 좋았다. 책이 술술 읽혀서 좋은 것 같다.