데이터 타입 === 값의 종류
자바스크립트의 모든 값은 데이터 타입을 갖는다.
자바스크립트는 7개의 원시타입(primitive type)과 1개의 객체 타입으로 분류할 수 있다.
ECMAScript 사양에 따르면 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따른다.
즉, 모든 수를 실수로 처리하고, 정수를 위한 데이터 타입은 존재하지 않는다.
NaN도 number type임을 기억하자
typeof NaN // number
NaN은 값이 아닌 식별자이므로 대소문자에 유의해야한다.
BigInt: Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체
BigInt는 정수 리터럴의 뒤에 n을 붙이거나(10n) 함수 BigInt()를 호출해 생성할 수 있다.
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n
const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// ↪ 9007199254740991n
16비트 유니코드 문자의 집합
따옴표로 감싸지 않은 문자는 식별자로 인식한다.
var string = hello; // ReferenceError: hello is not defined
ES6부터 도입된 새로운 문자열 표기법
백틱을 사용해 표현한다.
멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 문자열 처리 기능을 제공한다.
참과 거짓을 나타내는 true / false
값을 지정하지 않았을 때 자동으로 undefined가 들어간다.
변 수의 값이 없다는 것을 명시하고 싶을 때는 undefined가 아니고 null을 사용해야한다.
undefined는 '정의되지 않은'이라고 직역 된다.
정의란 변수에 값을 할당하여 변수의 실체를 명확히하는 것
즉, undefined는 값이 할당되지 않은 변수의 실체가 명확하지 않은 값이다.
ECMAScript 사양에서 변수는 '선언한다' 라고 표현
함수는 '정의한다'라고 표현한다.
대소문자를 구분한다. 식별자이므로 대소문자에 유의해야한다.
함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 한다.
var element = document.querySelector('.없는선택자')
console.log(element) // null
ES6에서 추가된 7번째 타입
변경 불가능한 원시타입
다른 값과 중복되지 않는 유일무이한 값이다.
var a = Symbol('abc'); // abc는 개발자가 구분하기 위한 값
var b = Symbol('abc');
a === b // false
주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.
11장 "원시 값과 객체의 비교"에서...
var a = 100
var b = 100
100 -> 0x123
a: 0x001 -> 0x123
b: 0x002 -> 0x123
100이라는 숫자는 유일무이한 불변값이다.
원시 타입 값들은 하나의 값에 대해서 하나의 메모리에 저장하게 되어있고, 변수 값이 같다면 모두 같은 메모리를 참조한다.
메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기를 결정해야 한다.
자바스크립트 엔진은 테이터 타입, 즉 값의 종류에 따라 정해진 크기의 메모리 공간을 확보한다. 즉, 변수에 할당된느 값의 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정된다.
ECMAScript 사양은 문자열과 숫자 타입 외의 데이터 타입의 크기를 명시적으로 규정하고 있지는 않다.
따라서, 자바스크립트 엔진 제조사 별로 메모리 공간 크기가 다를 수 있다.
모든 값은 데이터 타입을 가지며, 메모리에 2진수로 저장된다.
메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.
데이터 타입이 필요한 이유
1. 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
2. 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
3. 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론-type inference) 된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
변수는 타입을 갖지 않지만, 값은 타입을 갖는다.
이런 특징을 동적 타이핑(dynamic typing)이라 한다.
즉 자바스크립트는 동적 타입언어이다.
어떤 데이터 타입의 값이라도 자유롭게 할당 할 수 있다.
변수의 값은 언제든지 변경될 수 있다.
동적 타입 언어는 유연성은 높지만, 신뢰성은 떨어진다
변수 사용 주의사항
- 필요한 경우에 한해 제한적으로 사용하라
- 변수 값은 재할당에 의해 언제든 변경가능하므로 변수가 많으면 추적이 어려워 오류 발생 확률이 높아진다.
- 변수의 스코프는 좁게 만들어야한다.
- 전역 변수를 최대한 사용하지 않도록 한다.
- 의도치 않게 값이 변경될 가능성이 높다.
- 복장성을 증가 스키고 추적을 어렵게 만든다.
- 변수보다는 상수를 사용해 변경을 억제한다.
- 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다.