[JavaScript] 데이터 타입
동적 타입 언어
자바스크립트는 같은 변수에 숫자나 문자열과 같은 다양한 타입 데이터를 대입할 수 있다.
데이터 타입을 명시적으로 지정하지 않고 실행 시킬 때마다(런타임) 변수에 저장 된 데이터 타입을 동적으로 바꿀 수 있는 언어를 동적 타입 언어라고 한다.
테이터 타입의 분류
- 기본 타입(원시타입)
- 숫자(number)
- 문자열(string)
- 불리언(boolean)
- undefined
- null
- 심볼(symbol)
- 참조 타입(객체 타입)
- 객체
- 배열
- 함수
- 정규 표현식
*배열, 함수, 정규표현식도 모두 객체이다.
기본 타입(원시타입)의 데이터
- 숫자(number)
64비트 부동소수점 형식으로, 모든 숫자를 실수로 처리한다.
const num1 = 10; // 정수
const num2 = 3.14; // 실수
const num3 = -10;
console.log(num1/0); // Infinity
console.log(num3/0); // -Infinity
console.log('a'/3); // NaN
여기서 Infinity, -Infinity, NaN은 무한대라는 의미이다.
0으로 어떤 수를 나눌 수 없으므로 이때 리턴되는 값은 Infinity 이다.
또 문자열과 숫자는 계산할 수 없으므로 NaN이 리턴된다.
1. 문자열(string)
16비트 유니코드 문자셋(UTF-16)으로 구성된다.
작은따옴표(’’), 큰따옴표(””), 템플릿 리터럴(``)로 문자열을 할당할 수 있다.
const name = 'youbin';
const age = "31";
const result = `${name} is ${age} years old`;
console.log(result); // youbin is 31 years old
템플릿 리터럴 안에는 플레이스 홀더(${...})를 넣을 수 있다.
자바스크립트 엔진은 플레이스 홀더 안에 들어간 부분을 문자열로 출력해준다.
2. 불리언(boolean)
boolean 데이터 타입은 참, 거짓을 표현하는 데이터 타입이다.
값은 true, false만 존재하며, 조건식에 자주 쓰인다.
3. undefined
값이 할당되지 않았을 때, 자바스크립트 엔진이 암묵적으로 초기화하는 값이다.
const name;
console.log(name); // undefinde
변수는 정해졌지만 값이 할당되지 않아서 타입이나 값을 알 수 없을 경우 undefined
4. null
의도적으로 ‘값이 없음’을 명시하기 위해 할당하는 값
const test = null;
console.log(test); //null
console.log(typeof test) // object
하지만 null 타입의 typeof는 null이 아닌 object이다. (자바스크립트의 오류라고 한다)
따라서 null의 타입을 체크할때는 일치 연산자(===)를 사용하는게 좋다.
5. 심볼(symbol)
ES6에 새로 생긴 데이터 타입이다.
변경 불가한 원시 타입의 값이며, 다른 값과 중복되지 않는 고유한 값이다.
심볼은 Symbol 함수로 호출하여 생성할 수 있다.
const sym1 = Symbol();
const sym2 = Symbol('foo');
const sym3 = Symbol('bar');
console.log(sym1); // Symbol()
console.log(sym2); // Symbol(foo)
console.log(sym3); // Symbol(bar)
console.log(typeof sym1); // symbol
console.log(typeof sym2); // symbol
console.log(typeof sym3); // symbol
Symbol함수를 호출하면 매번 새로운 심볼이 생성된다.
const sym1 = Symbol();
const sym2 = Symbol();
const sym3 = Symbol('foo');
const sym4 = Symbol('foo');
console.log(sym1 === sym1); // true
console.log(sym1 === sym2); // false
console.log(sym3 === sym4); // false
그런데 심볼 타입은 number, string, boolean 타입과는 다르게 생성자로 사용 할 수 없다.
const sym = new Symbol();
- Symbol.for()
인자로 전달 받은 문자열 값을 키로 갖는 심볼을 전역 레지스트리에 생성하고, 그 문자열 값을 키로 갖고 있는 심볼을 생성하여 레지스트리에서 문자열로 불러온다.
단순히 Symbol()로 호출하여 생성하는 것에 비해, 생성되는 심볼이 키를 갖고 있으며 전역 심볼 레지스트리에 저장된다는것이 차이점이다.
const sym1 = Symbol.for('foo');
const sym2 = Symbol.for('foo');
console.log(sym1 === sym2); // true
- Symbol.keyFor()
인자로 전달받은 심볼을 전역 레지스트리에서 찾고, 값이 없다면 undefined를 반환한다.
const unShareSym = Symbol('foo');
const symKey1 = Symbol.keyFor(unShareSym);
console.log(symKey1); // undefined
const shareSym = Symbol.for('foo');
const symKey2 = Symbol.keyFor(shareSym);
console.log(symKey2); // foo