data type : 7 개의 데이터 타입 제공
원시 타입/primitive type과 객체 타입/object,reference type으로 분류
구 분 | 데이터 타입 | 설 명 |
---|---|---|
숫자 타입 (number) | 숫자. 정수와 실수 구분 없이 하나의 숫자 타입만 존재 | |
문자열 타입 (string) | 문자열 | |
불리언 타입 (boolean) | 논리적 참(true)과 거짓(false) | |
원시타입 | undefined 타입 | var 키워드로 선언된 변수에 암묵적으로 할당되는 값 |
null 타입 | 값이 없다는 것을 의도적으로 명시할 때 사용하는 값 | |
심벌 타입 (symbol) | ES6에서 추가된 7번째 타입 | |
-------- | --------------------- | ---------------------------------------------- |
객체타입 | 객체, 함수, 배열 등 | |
2진수, 8진수, 16진수를 표현하는 데이터 타입은 제공하지 않아 값을 참조하면 10진수로 해석됨
// 모두 숫자 타입 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(4 / 2); // 2 console.log(3 / 2); // 1.5
숫자 타입의 세 가지 특별한 값
1) Infinity : 양의 무한대
2) -Infinity : 음의 무한대
3) NaN : 산술 연산 불가 (not-a-number)console.log(10 / 0); // Infiniity console.log(10 / -0); // -Infiniity console.log(1 * 'string'); // NaN
// 문자열 타입 var string; string = '문자열'; // 작은따옴표 string = "문자열"; // 큰따옴표 string = `문자열`; // 백틱(ES6) string = '작은따옴표로 감싼 문자열 내의 "큰따옴표"는 문자열로 인식'; string = "큰따옴표로 감싼 문자열 내의 '작은따옴표'는 문자열로 인식";
// 따옴표로 감싸지 않은 hello를 식별자로 인식 var string = hello; // ReferenceError : hello is not defined
ver template = `Template literal`; console.log(template); // Template literal
var str = 'Hello world'; // SytaxError : Invalid or unexpected token
문자열 내에서 줄바꿈 등의 공백/white space 를 표현하려면 백슬래시()로 시작하는 이스케이프 시퀀스/escape sequence 사용
이스케이프 시퀀스 | 의미 |
---|---|
\0 | Null |
\b | 백스페이스 |
\f | Form Feed : 프린터로 출력할 경우 다음 페이지의 시작 지점으로 이동 |
\n | 개행 LF. Line Feed : 다음 행으로 이동 |
\r | 개행 CR. Carriage Return : 커서를 처음으로 이동 |
\t | 탭 (수평) |
\v | 탭 (수직) |
\uXXXX | 유니코드, ex) '\u0041'은 A , '\u{1F600}'는 😃 |
\' | 작은따옴표 |
\" | 큰따옴표 |
\ | 백슬래시 |
줄바꿈과 들여쓰기가 적용된 HTML 문자열은 이스케이프 시퀀스를 사용해 작성
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 template = `<ul> <li><a href="#">Home</a></li> </ul>`; console.log(template);
❗️출력 결과
<ul> <li><a href="#">Home</a></li> </ul>
var first = 'Gil-dong'; var last = 'Hong'; // ES5 : 문자열 연결 console.log('My name is ' + first + ' ' + last + '.'); // My name is GIl-dong Hong.
var first = 'Gil-dong'; var last = 'Hong'; // ES6 : 표현식 삽입 console.log(`My name is ${first} ${last}.`); // My name is GIl-dong Hong.
console.log(`1 + 2 = ${1 + 2}`); // 1 + 2 = 3
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
변수에 값이 없다는 것을 명시하고 싶을 땐 null을 할당
var foo = 'Kim'; // 이전 참조를 제거, foo는 더 이상 'Kim'을 참조하지 않음 // 유용해 보이지 않음, 변수의 스코프를 좁게 만들어 변수 자체를 빨리 소멸시키는 편이 낫다 foo = null;
ex) HTML 요소를 검색해 반환하는 document.querySelector 메서드는 조건에 부합하는 요소를 검색할 수 없는 경우 에러 대신 null 반환
<!DOCTYPE html> <html> <body> <script> var element = document.querySelector('.myClass'); // HTML 문서에 myClass 클래스를 갖는 요소가 없으면 null 반환 console.log(element); // null </script> </body> </html>
// 심벌 값 생성 var key = symbol('key'); console.log(typeof key); // symbol
// 객체 생성 var obj = { };
// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용 obj[key] = 'value'; console.log(obj[key]); // value
var score = 100;
메모리 공간 확보 : 몇 바이트의 메모리 공간을 사용해야 낭비와 손실 없이 값을 저장할 수 있는지 알아야함
-> 리터럴 100을 숫자 타입의 값으로 해석
-> 숫자 타입의 값 100을 저장하기 위해 8바이트의 메모리 공간을 확보
-> 확보된 메모리에 숫자 값 100을 2진수로 저장
:: 변수에 할당되는 값의 데이터 타입에 따라 확보해야할 메모리 공간의 크기가 결정됨
:: 변수에 숫자 타입의 값이 할당되어 있어 score 변수를 숫자 타입으로 인식
:: 숫자 타입은 8바이트 단위로 저장되므로 score 변수를 참조하면 8 바이트 단위로 메모리 공간에
저장된 값을 읽음
:: score 변수에 할당된 값은 숫자 타입의 값
:: 참조하면 메모리 공간의 주소에서 읽어 들인 2진수를 숫자로 해석
❗️데이터 타입이 필요한 이유
❗️변수를 사용할 때 주의할 점
- 변수는 필요한 경우에 한해 제한적으로 사용, 무분별한 남발은 금물
- 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용 억제
- 전역 변수는 최대한 사용하지 않는다
(어디서든지 참조/변경 가능한 전역 변수는 의도치 않게 값이 변경될 가능성이 높아 다른 코드에 영향을 줄 가능성도 높다)- 변수보다는 상수를 사용해 값을 변경을 억제
- 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다