값의 종류를 의미한다. ES6 기준 자바스크립트는 7개의 데이터 타입을 제공하는데, 원시 타입(primitive type)과 객체 타입(object/reference type)으로 구분할 수 있다.
- 자바스크립트는 모든 수를 실수로 처리하며, 정수만 표현하기 위한 별도의 데이터 타입이 존재하지 않는다.
- 모두 메노리에 배정밀도 64비트 부동소수점 형식의 2진수로 저장되며, 메모리에 있는 어떤 형식(2진수, 8진수 등)의 값을 참조하든지 모두 10진수로 해석된다.
- 숫자 타입은 다음의 특별한 값도 가진다. (Infinity, -Infinity, NaN)
**자바스크립트 엔진은 대소문자를 구별한다.
- 문자열은 0개 이상의 16비트 유니코드 문자(UTF-16)의 집합으로 전 세계 대부분의 문자를 표현할 수 있다.
- 나타내는 방법은 세 가지. (' ', " ", 백틱) - 문자열 나타낼 때 가장 일반적으로 작은따옴표가 사용된다.
템플릿 리터럴은 ES6부터 도입되었는데, 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공한다.
템플릿 리터럴은 런타임에 일반 문자열로 변환되어 처리된다.
템플릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않고도 줄바꿈이 허용되며, 모든 공백도 그대로 적용된다.
⛔️ 일반 문자열 내에서는 줄바꿈이 허용되지 않기에, 공백을 표현하려면 백슬래시()로 시작하는 이스케이프 시퀀스를 사용해야 한다.
var template = '<ul>\n\t<li><a href="#">Home</a></li>\n</ul>';
console.log(template);
// 출력결과
<ul>
<li><a href="#">Home</a></li>
</ul>
표현식 삽입을 위해 ${ }으로 표현식을 감싼다. 표현식의 평가 결과가 문자열이 아니더라도 문자열로 타입이 강제로 변환되어 삽입된다.
표현식의 평가 결과가 들어간다는 것은 아래와 같이 값이 계산되어 출력된다는 것이다.console.log(`1+2=${1+2}`); // 1+2 = 3
아래와 같이 변수화하여 사용할 수 있다는 것이다.
var first = 'Minju'; var last = 'Kim'; //ES6: 표현식 삽입 console.log(`My name is ${first}${last}.`); // My name is Minju Kim.
😭 템플릿 리터럴이 없었다면 전부 '+'로 문자열을 합쳐줬어야 한다.
true | false
개발자가 의도하여 작성하는 값이 아니라, var로 변수를 선언하면 자바스크립트 엔진이 자동적으로
undefined
로 초기화시켜버리는 것이다.
변수를 참조했을 때undefined
가 반환된다면, 변수 선언 이후 값이 할당되지 않은, 초기화되지 않은 변수라는 것을 알 수 있다.
변수에 값이 없다는 것을 의도적으로 명시할 때 사용한다. 변수에 null을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다. 이는 다시 말해, 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행할 것이다.
var foo = 'Lee';
foo = null
// 이전 참조를 제거. foo 변수는 더 이상 'Lee'를 참조하지 않는다.
// 유용해 보이지 않는다. 변수의 스코프를 좁게 만들어 변수 자체를 재빨리 소멸시키는 편이 낫다.
🍊 함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null
을 반환하기도 한다. 예를 들어, HTML 요소를 검색해 반환하는 document.querySelector 메서드
는 조건에 부합하는 HTML 요소를 검색할 수 없는 경우 에러 대신 null
을 반환한다.
ES6에 추가된 타입으로, 변경 불가능한 원시 타입의 값이다. 다른 값과 중복되지 않는 유일무이한 값으로, 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용된다.
Symbol함수를 통해 생성한다. 이 때 생성된 심벌 값은 외부에 노출되지 않으며, 다른 값과 절대 중복되지 않는 유일무이한 값이다.
// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key); // symbol
// 객체 생성
var obj = {};
// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.
obj[key] = 'value';
console.log(obj[key]); //value
지금까지 살펴본 6가지 데이터 타입 (숫자, 문자열, 불리언, undefined, null 심벌 타입)외의 거의 모든 것은 객체
이다.
자바스크립트 엔번에 읽어들여야 할 메모리의 크기를 알 수 있다.
값을 읽어들일 때, 데이터 타입에 따라 어떻게 해석해야 할지 알 수 있다.
진은 데이터 타입, 즉 값의 종류에 따라 정해진 크기의 메모리 공간을 확보한다. 즉, 변수에 할당되는 값의 데이터 타입에 따라 확보해야 할 공간의 크기가 결정된다.
값 참조 시에, 한 번에 읽어 들여야 할 메모리 공간의 크기, 즉 메모리 셀의 개수(바이트 수)를 알아야 한다. 자바스크립트 엔진은 변수에 할당되어 있는 값의 타입으로 한
🍊 데이터 타입이 필요한 이유 세 가지
값을 저장할 때 확보해야 하는 메모리 공간의 크기
를 결정하기 위해값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기
를 결정하기 위해- 메모리에서 읽어 들인
2진수를 어떻게 해석할지
결정하기 위해
정적 타입언어는 명시적 타입선언을 하는 언어를 의미하며, 동적 타입언어는 명시적 타입선언을 하지 않는 언어를 의미한다. 정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터에 맞는 값을 할당했는지 검사하는 처리)를 수행한다. 만약 타입 체크 통과 못했다면 에러를 발생시킨다.
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론 type reference)된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. 이를 동적 타이핑이라고 한다.
⛔️ 동적 타입 언어는 유연성은 높지만 신뢰성은 떨어진다.
문제점 1. 변수 값은 언제든지 변경될 수 있기 때문에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어렵다.
문제점 2. 값의 변경에 의해 타입도 언제든지 변경될 수 있다.
문제점 3. 개발자의 의도와 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동으로 변환되기도 한다. 이에 의해 오류가 막 발생할 것이다.