데이터 타입
자바스크립트는 6개의 원시형 데이터 타입, 1개의 객체 데이터 타입을 제공한다.
구분 | 데이터 타입 | 설명 |
---|---|---|
원시 타입 | number | 숫자. 정수와 실수 구분 없음. |
string | 문자열 | |
boolean | 논리적 참(true)과 거짓(false) | |
undefined | var 키워드로 선언된 변수에 암묵적으로 할당되는 값 | |
null | 값이 없다는 것을 의도적으로 명시할 때 사용하는 값 | |
symbol | 변경 불가능, 다른 값과 중복되지 않는 값 | |
객체 타입 | object | 객체, 함수, 배열 등 |
숫자 타입
자바스크립트는 다른 언어와 다르게 int, long, float, double 등이 따로 없고 숫자는 모두 number 타입으로 처리한다.
모든 수는 실수(배정밀도 64비트 부동소수점 형식)로 처리한다.
따라서 아래 코드처럼 동작한다
console.log(1 === 1.0); // true
문자열 타입
자바스크립트는 자바와 달리 문자열이 원시 타입이다.
따라서 변경 불가능한 값(immutable value)이다.
템플릿 리터럴에서 ${}
을 이용해서 삽입된 표현식은 항상 문자열로 타입이 강제로 변환된다.
console.log(typeof `${1 + 2}`); // string
불리언 타입
불리언 타입의 값은 true, false 뿐이다.
undefined 타입
undefined 타입의 값은 undefined가 유일하다.
var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화된다.
var foo;
console.log(foo); // undefined
undefined는 자바스크립트 엔진이 변수를 초기화할 때 사용하는 값이다.
따라서 개발자가 특정 변수에 undefined를 할당하는 것은 undefined의 본래 취지에 맞지 않다.
개발자가 의도적으로 변수에 값이 없다는 것을 명시하고 싶을 때에는 undefined가 아니라 null을 할당하는 것을 권장한다.
null 타입
null 타입의 값은 null이 유일하다.
null은 변수에 값이 없다는 점을 '의도적으로 명시'할 때 사용한다.
함수가 유효한 값을 반환할 수 없는 경우에 명시적으로 null을 반환하기도 한다. (예: document.querySelector
의 검색 결과값이 없는 경우)
<!doctype html>
<html>
<body>
<script>
var element = document.querySelector('.something');
// something 클래스를 갖는 요소가 없으면 null 반환
console.log(element); // null
</script>
</body>
</html>
typeof null
typeof
로 null의 타입을 확인해보면 null이 아니라 object라는 결과가 나온다.
이는 자바스크립트의 버그다.
ECMAScript에 이를 수정하자는 제안이 올라왔지만 기각되었다.
console.log(typeof null) // object
자세한 사항은 MDN에 기재된 설명을 참고하면 된다.
symbol 타입
변경 불가능하며 다른 값과 중복되지 않는 유일무이한 값이다.
// 심벌 값에 대한 설명이 같더라도 유일무이한 심벌 값을 생성한다.
const symbol1 = Symbol('symbol');
const symbol2 = Symbol('symbol');
console.log(symbol1 === symbol2); // false
따라서 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.
var key = Symbol('key');
console.log(typeof key); // symbol
var obj = {};
obj[key] = 'value';
console.log(obj[key]); // value
다른 원시 값은 리터럴을 통해 생성하지만 심벌은 Symbol 함수를 호출해 생성한다.
이때 생성된 심벌값은 외부에 노출되지 않으며, 다른값과 절대 중복되지 않는 유일무이한 값이다.
(심벌은 별도 페이지로 정리할 예정)
객체 타입
원시 타입 이외의 모든 값은 모두 객체 타입이다.
(객체 타입은 별도 페이지로 정리할 예정)
데이터 타입의 필요성
- 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
- 값을 참조할 때 한 번에 읽어들여야 할 메모리 공간의 크기를 결정하기 위해
- 메모리에서 읽어들인 2진수를 어떻게 해석할지 결정하기 위해
동적 타이핑
자바스크립트는 동적 타이핑이 가능하다.
즉 변수의 타입이 바뀔 수 있다.
var foo;
console.log(typeof foo) // undefined
foo = 3;
console.log(typeof foo) // number
foo = 'Hello';
console.log(typeof foo) // string
foo = true;
console.log(typeof foo) // boolean
foo = null;
console.log(typeof foo) // object
foo = Symbol();
console.log(typeof foo) // symbol
foo = {};
console.log(typeof foo) // object
foo = [];
console.log(typeof foo) // object (배열인지 확인하기 위해서는 Array.isArry()를 사용해야 한다.)
foo = function () {};
console.log(typeof foo) // function