자바스크립트(ES6)는 7개의 데이터 타입을 제공한다. 7개의 데이터 타입은 원시 타입(primitive type)과 객체 타입(object type)으로 분류할 수 있다.
var binary = 0b01000001; // 2진수
var octal = 0o101; // 8진수
var hex = 0x41; // 16진수
// 표기법만 다를 뿐 모두 같은 값이다.
console.log(binary); // 65
console.log(octal); // 65
console.log(hex); // 65
console.log(binary === octal); // true
console.log(octal === hex); // true
따로 진수표현을 위한 데이터 타입을 제공하지 않으므로 이들 값을 참조하면 모두 10진수로 해석된다.
ECMAScript 사양에 따르면 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따른다. 따라서 모든 수는 실수로 처리된다. 따라서 정수로 표시되는 수끼리 나누더라도 실수가 나올 수 있다.
숫자 타입은 Infinity, -Infinity, NaN(산술 연산 불가, not-a-number) 값도 표현할 수 있다.
// 문자열 타입
var string;
string = '문자열'; // 작은따옴표
string = "문자열"; // 큰따옴표
string = `문자열`; // 백틱(ES6)
자바스크립트에서 문자열을 사용하는 방법. 작은따옴표는 큰따옴표 안에, 큰따옴표는 작은따옴표 안에 사용할 경우 따옴표 안에서 다른 문자열의 표현이 가능하다.
문자열을 따옴표로 감싸는 이유는 키워드나 식별자 같은 토큰과 구분하기 위해서다. 따옴표로 감싸지지 문자열은 자바스크립트 엔진에 의해 키워드나 식별자 같은 토큰으로 인식된다.
자바스크립트의 문자열은 원시 타입이며, 변경 불가능한 값(immutable value)이다. 문자열은 생성되면 변경이 불가능하다.
템플릿 문자열(template litreal)은 ES6부터 도입된 새로운 문자열 표기법이다.
탬플릿 리터럴은 멀티 라인 문자열(multi-line-string), 표현식 삽입(expression interpolation), 태그드 탬플릿(tagged template) 등 편리한 문자열 처리 기능을 제공한다. 템플릿 리터럴은 런타임에 일반 문자열로 반환되어 처리된다.
템플릿 리터럴은 일반적인 따옴표 대신 백틱을 사용해 표현한다.
일반 문자열 내에서 줄바꿈 등의 공백(white space)를 표현하려면 백슬래시()로 시작하는 이스케이프 시퀸스를 사용해야 한다.
템플릿 리터럴 내에서는 이스케이프 시퀸스를 사용하지 않고도 줄바꿈이 허용되며, 모든 공백이 있는 그대로 적용된다.
var template = `<ul>
<li><a href="#">Home</a></li>
</ul>`;
console.log(template)
/* 실행 결과
<ul>
<li><a href="#">Home</a></li>
</ul>
*/
'+' 연산자는 피연사자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
탬플릿 리터럴 내에서는 표현식 삽입(expression interpolation)을 통해 간단히 문자열을 삽입할 수 있다. 표현식을 삽입하려면 백틱으로 문자열을 작성하고 '${}'으로 표현식을 감싼다.
var first = 'Dong Hyun';
var last = 'Lee';
// ES6: 표현식 삽입
console.log(`My name is ${first} ${last}.`); // My name is Dong Hyun Lee.
var foo = true;
console.log(foo); // true
foo = false;
console.log(foo); // false
대소문자에 주의하자 not True / False
undefined는 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값이다.
변수를 참조했을 때 undefined가 반환된다면 참조한 변수가 선언 이후 값이 할당된적이 없는, 즉 초기화되지 않은 변수라는 것을 간파할 수 있다.
자바스크립트 엔진이 변수를 초기화하는 데 사용하는 undefined를 개발자가 의도적으로 변수에 할당한다면 undefined의 본래 취지와 어긋날뿐더러 혼란을 줄 수 있으므로 권장하지 않는다.
변수에 값이 없다는 것을 의도적으로 명시하고 싶을 때는 undefined가 아닌 null을 할당한다.
자바스크립트는 선언(declaration)과 동시에 암묵적으로 정의(define)가 이루어지므로 선언과 정의의 구분이 모호하다.
ECMAScript 사양에서 변수는 '선언하다(declaration)', 함수는 '정의하다(definition)'라고 표현하므로 우리도 이에따라 생각한다.
* 모던 자바스크립트 Deep Dive ( 자바스크립트의 기본 개념과 동작 원리 ) / 이웅모 지음