구분 | 데이터 타입 | 설명 |
---|---|---|
원시타입 | 숫자(number) 타입 | 숫자. 정수와 실수 구분 없이 하나의 숫자 타입만 존재 |
문자열(string) 타입 | 문자열 | |
불리언(boolean) 타입 | 논리적 참(true)과 거짓(false) | |
undefined 타입 | var 키워드로 선언된 변수에 암묵적으로 할당되는 값 | |
null 타입 | 값이 없다는 것을 의도적으로 명시할 때 사용하는 값 | |
심벌(symbol) 타입 | 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); // 65
console.log(octal); // 65
console.log(hex); // 65
console.log(binary===octal); // true
console.log(octal === hex); // true
//숫자 타입은 모두 실수로 처리
console.log(1 === 1.0); //true
//숫자 타입의 세 가지 특별한 값
console.log(10 / 0); // Infinity
console.log(10 / -0); // -Infinity
console.log(1* 'String'); // NaN
자바스크립트는 대소문자를 구별하므로 NaN을 NAN, Nan, nan과 같이 표현하면 에러가 발생한다.
자바스크립트 엔진은 NAN, Nan, nan을 값이 아닌 식별자로 해석한다.
``
)으로 텍스트를 감싼다. //문자열 타입
var string;
string = '문자열'; //작은 따옴표
string = "문자열"; //큰 따옴표
string = `문자열`; // 백틱(ES6)
string = '작은 따옴표로 감싼 문자열 내의 "큰따옴표"는 문자열로 인식된다.';
string = "큰따옴표로 감싼 문자열 내의 '작은따옴표'는 문자열로 인식된다";
//따옴표로 감싸지 않은 hello를 식별자로 인식한다.
var string = hello; // ReferenceError: hello is not defined
자바스크립트의 문자열은 원시 타입이며, 변경 불가능한 값(immutable value)이다. 이것은 문자열이 생성되면 그 문자열을 변경할 수 없다는 것을 의미한다.
var template = `Template literal`;
console.log(template); // Template literal
var template = '<ul>\n\t<li><a href="#">Home</a></li>\n</ul>;
console.log(template);
//결과
<ul>
<li><a href="#">Home</a></li>
</ul>
var first = 'Ung-mo';
var last = 'Lee';
//ES5: 문자열 연결
console.log('My name is ' + first + ' ' + last + '.'); // My name is Ung-mo Lee.
var first = 'Ung-mo'
var last = 'Lee';
//ES6: 표현식 삽입
console.log(`My name is ${first} ${last}.`); // My name is Ung-mo Lee.
console.log('1 + 2 = ${1 +2}'); // 1 + 2 = ${1 + 2}
var foo = true;
console.log(foo); // true
foo = false;
console.log(foo); //false
var foo;
console.log(foo); //undefined
이처럼 undefined는 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값이다.
개발자가 의도적으로 변수에 undefined를 할당하는것은 권장하지 않는다.
var foo = 'Lee';
//이전 참조를 제거. foo 변수는 더 이상 'Lee'를 참조하지 않는다.
//유용해 보이지는 않는다. 변수의 스코프를 좁게 만들어 변수 자체를 재빨리 소멸시키는 편이 낫다.
foo = null;
함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 한다. 예를 들어, HTML 요소를 검색해 반환하는 document.qeurySelector 메서드는 조건에 부합하는 HTML 요소를 검색할 수 없는 경우 에러 대신 null을 반환한다.
//심벌 값 생성
var key = Symbol('key');
console.log(typeof key); //symbol
//객체 생성
var obj = {};
//이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.
obj[key] = 'value';
console.log(obj[key]); //value
var score = 100;
데이터 타입, 값의 종류에 따라 정해진 크기의 메모리 공간을 확보한다.
데이터 타입에 따라 확보되는 메모리 공간의 크기
문자열과 숫자타입 외의 데이터 타입의 크기를 명시적으로 규정하고 있지는 않다. 다만, 숫자 타입은 배정밀도 64비트 부동소수점 형식을 사용한다고 명시되어 있고, 배정밀도 64비트 부동소수점 형식은 8바이트로 숫자를 표현한다.
컴파일러 또는 인터프리터는 심벌 테이블이라고 불리는 자료구조를 통해 식별자를 키로 바인딩된 값의 메모리 주소, 데이터 타입, 스코프 등을 관리한다.
//c 변수에는 1바이트 정수 타입의 값만 할당 가능
char c;
//nu 변수에는 4바이트 정수 타입의 값만 할당 가능
int num;
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. 이러한 특징을 동적 타이핑이라고 하며, 자바스크립트를 정적 타입 언어와 구별하기 위해 동적 타입 언어라 한다.