자바스크립트의 데이터 타입은 크게 원시 타입과 객체 타입으로 나뉜다.
객체 타입인 object를 제외한 모든 타입을 원시 타입이라 생각하면 된다.
원시 타입
undefined
undefined는 선언 후 값을 할당하지 않은 변수 또는 값이 주어지지 않은 인수에 자동으로 할당되는 값.
undefined는 오직 undefined라는 값만 가질 수 있다.
null
아직 값이 없거나 비어있는 값을 표현할 때 사용.
null의 특별한 점은 다른 원시값들과 다르게 typeof로 null을 확인했을 때 null이 아닌 object가 반환된다.
초창기 자바스크립트의 값 표현 방식 때문에 발생한 문제로, 이를 바꾸면 호환성이 깨지기 때문에 바꾸지 못했다.
undefined는 '선언됐지만 할당되지 않은 값'이고, null은 '명시적으로 비어있음을 나타내는 값'으로 사용하는게 일반적.
Boolean
참 과 거짓만을 가질 수 있는 데이터 타입. 주로 조건문에서 많이 쓰인다.
true, false 같은 boolean형의 값 외에도 조건문에서 true, false처럼 취급되는 값들이 존재한다.
아래는 falsy값을 정리한 표다.
| 값 | 타입 | 설명 |
| false | Boolean | 대표적인 falsy 값 |
| 0, -0, 0n, 0x0n | Number, BigInt | 부호나 소수점 유무 상관없이 falsy 값 |
| NaN | Number | NaN(Not a Number)은 falsy 값 |
| '', "", `` | String | 문자열이 falsy하려면 반드시 공백 없는 빈 문자열이어야 한다. |
| null | null | falsy 값 |
| undefined | undefined | falsy 값 |
falsy로 취급되는 값 외에는 모두 true로 취급된다.
단, 객체와 배열은 내부 값 존재 여부와 상관없이 truthy로 취급된다. 즉, {}, [] 모두 truthy한 값.
Number
정수와 실수를 구분해 저장하는 타 언어와 다르게, 자바스크립트는 모든 숫자를 하나의 타입에 저장했었다.
2진수, 8진수, 16진수 등 별도 데이터 타입을 제공하지 않으므로 각 진수별로 값을 표현해도 모두 10진수로 해석돼 동일한 값으로 표시된다.
- (2^53 - 1) ~ 2^53 - 1 사이의 값을 저장할 수 있다. 때문에 이 범위 외의 값들을 다루기 어려웠다.
// number의 한계
9007199254740992 === 9007199254740993 //마지막 숫자가 다른데, 더 이상 다룰 수 없는 크기라서 true가 반환된다.
BigInt
number가 다룰 수 있는 숫자 크기 제한을 극복하기 위해 ES2020에서 새롭게 나온 것.
number의 한계를 넘어서 더 큰 숫자를 저장할 수 있게 해 준다.
// BigInt 사용법
const bigint1 = 9007199254740993n // 1. 접미사에 n을 붙혀 사용
const bigint2 = BigInt('9007199254740993') // 2. BigInt 함수 사용
String
텍스트 타입의 데이터를 저장하기 위해 사용. ' ', " ", ` `로 표현.
` `(백틱)으로 표현하는 문자열은 ' ', " "와는 차이점이 있다.
백틱을 사용하면 같은 문자열을 반환하지만 줄 바꿈이 가능하고, 문자열 내부에 표현식을 쓸 수 있다.
// '\n안녕.\n'
const Text = `
안녕.
`
// SyntaxError
const Text = "
안녕.
"
자바스크립트 문자열의 특징 중 하나는 변경 불가능하다는 것이다.
한번 문자열이 생성되면 그 문자열을 변경할 수 없다.
Symbol
Symbol은 ES6에 새로 추가된 7번째 타입으로, 중복되지 않는 어떤 고유 값을 나타내기 위해 만들어졌다. 때문에 Symbol함수에 같은 인수를 넘겨주더라도 동일값으로 인정되지 않는다.
심벌은 심벌 함수를 이용해서만 만들 수 있다. 심벌을 생성하려면 반드시 Symbol()을 사용해야 한다.
동일한 값을 사용하기 위해서는 Symbol.for를 사용하면 된다.
객체 타입
객체 타입은 앞서 정리한 원시 타입 이외의 모든 것이라 생각하면 된다.
배열, 함수, 정규식, 클래스 등이 포함된다.
객체 타입은 참조를 전달한다고 해서 참조 타입으로도 불리는데, 여기서 자바스크립트의 동등 비교 특징이 나타난다.
✨참조 : 김용찬, " 모던 리액트 Deep Dive ", 위키북스(2023)