
데이터 타입은 값의 종류를 말함. 자바스크립트(ES6)는 7개의 데이터 타입을 제공. 크게 원시 타입과 객체 타입으로 분류.

// 모두 숫자 타입
var integer = 10; // 정수
var double = 10.12; // 실수
var negative = -20; // 음의 정수var binary = 0b01000001; // 2진수
var octal = 0o101; // 8진수
var hex = 0x41; // 16진수
// 표기법만 다를 뿐 모두 같은 값이다.
console.log(binary); // Output: 65
console.log(octal); // Output: 65
console.log(hex); // Output: 65
console.log(binary === octal); // Output: true
console.log(octal === hex); // Output: true// 숫자 타입은 모두 실수로 처리된다.
console.log(1 === 1.0); // Output: true
console.log(4 / 2); // Output: 2
console.log(3 / 2); // Output: 1.5console.log(10 / 0); // Output: Infinity
console.log(10 / -0); // Output: -Infinity
console.log(1 * 'String'); // Output: NaN// 문자열 타입
var string;
string = '문자열'; // 작은따옴표
string = '문자열'; // 큰따옴표
string = `문자열`; // 백틱 (ES6)
string = '작은따옴표로 감싼 문자열 내의 "큰따옴표"는 문자열로 인식된다.';
string = "큰따옴표로 감싼 문자열 내의 '작은따옴표'는 문자열로 인식된다.";var template = `Template literal`;
console.log(template); // Template literal// 일반 문자열
var str = 'Hello
world.';
// Output: SyntaxError: Invalid or unexpected token
// 템플릿 리터럴
var template = `Hello
world`;
console.log(template);
// Output: Hello
// Output: worldvar first = 'Ung-mo';
var last = 'Lee';
// ES5: 문자열 연결
console.log('My name is ' + first + ' ' + last + '.'); // Output: My name is Ung-mo Lee.
// ES6: 표현식 삽입
console.log(`My name is ${first} ${last}.`); // Output: My name is Ung-mo Lee.
// 템플릿 리터럴 표현식 강제 타입 변환
console.log(`1 + 2 = ${1 + 2}`); // Output: 1 + 2 = 3
// 템플릿 리터럴이 아닌 일반 문자열
console.log('1 + 2 = ${1 + 2}'); // Output: 1 + 2 = ${1 + 2}var foo = true;
console.log(foo); // Output: true
foo = false;
console.log(foo); // Output: falsevar foo;
console.log(foo); // Output: undefinedvar foo = 'Lee';
// 이전에 할당되어 있던 값에 대한 참조를 제거. foo 변수는 더 이상 'Lee'를 참조하지 않는다.
// 유용해 보이지는 않는다. 변수의 스코프를 좁게 만들어 변수 자체를 재빨리 소멸시키는 편이 낫다.
foo = null;// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key); // Output: symbol
// 객체 생성
var obj = {};
// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.
obj[key] = 'value';
console.log(obj[key]); // Output: value
// 같은 형태로 생성해도 다른 값이다
console.log(Symbol(자바스크립트를 이루고 있는 거의 모든 것이 객체임. 지금까지 살펴본 6가지 타입 이외의 값은 모두 객체 타입.메모리 공간의 크기를 결정하기 위해.메모리 공간의 크기를 결정하기 위해.2진수를 어떻게 해석할지 결정하기 위해.// c 변수에는 1바이트 정수 타입의 값(-128 ~ 127)만을 할당할 수 있다.
char c;
// num 변수에는 4바이트 정수 타입의 값(-2,124,483,648 ~ 2,124,483,647)만을 할당할 수 있다.
int num;// typeof 연산자는 연산자 뒤에 위치한 피연산자의 데이터 타입을 문자열로 반환.
var foo;
console.log(typeof foo); // Output: undefined
foo = 3;
console.log(typeof foo); // Output: number
foo = 'Hello';
console.log(typeof foo); // Output: string
foo = true;
console.log(typeof foo); // Output: boolean
foo = null;
console.log(typeof foo); // Output: object
foo = Symbol(); // 심벌
console.log(typeof foo); // Output: symbol
foo = {}; // 객체
console.log(typeof foo); // Output: object
foo = []; // 배열
console.log(typeof foo); // Output: object
foo = function () {}; // 함수
console.log(typeof foo); // Output: function자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정됨.(타입 추론) 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있음. 정적 타입 언어와 구별하기 위해 이를 동적 타입 언어라 함.변수 값은 언제든지 변경될 수 있기 때문에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있음.
변수 값을 확인하기 전에 타입을 확신할 수 없음.
개발자의 의도와는 상관 없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되어 예기치 못한 오류를 마주할 수 있음.
이러한 이유로 안정적인 프로그램을 만들기 위해 변수 사용 전 데이터 타입을 체크해야 하는 경우가 있는데 매우 번거로울뿐더러 코드량도 증가함.