## 자바스크립트의 데이터 타입
자바스크립트에는 총 8가지 데이터 타입이 있으며, **원시 타입(Primitive Type)**과 **비원시 타입(참조 타입, Reference Type)**으로 구분된다.
자바스크립트는 **동적 타입 언어**로, **변수에 다른 타입의 값을 재할당**할 수 있으며 **런타임에 타입이 결정**된다.
## 데이터 타입 분류
| 분류 | 타입 목록 |
|-----------|-----------------------------------------------|
| 원시 타입 | `number`, `string`, `boolean`, `undefined`, `null`, `symbol`, `bigint` |
| 참조 타입 | `object` (배열, 함수, 객체 등 모두 포함) |
## 원시 타입 (Primitive Types)
### number
모든 숫자형은 정수와 실수 구분 없이 모두 `number` 타입이 된다.
`NaN`, `Infinity` 같은 특수한 숫자값도 포함한다.
```javascript
// 기본 숫자
const integer = 42;
const float = 3.14;
const negative = -10;
// 특수 숫자값
const infinity = Infinity;
const negativeInfinity = -Infinity;
const notANumber = NaN;
```
### string
문자열 데이터를 표현한다. 3가지 따옴표 방식을 지원함
```javascript
// 다양한 문자열 선언 방식
const singleQuote = '작은따옴표';
const doubleQuote = "큰따옴표";
const templateLiteral = `템플릿 리터럴 ${123}`;
```
### boolean
true, false를 나타낸다.
```javascript
const isValid = true;
const isComplete = false;
```
🔗 참고 : [[Truthy와 Falsy]]
### undefined
변수가 선언되었지만 값이 할당되지 않은 상태를 의미한다.
```javascript
let x;
console.log(x); // undefined
```
🔗 참고 : [[undefined와 null#undefined|undefined]]
### null
명시적으로 값이 없음을 나타내기 위한 값
```javascript
let obj = null;
```
🔗 참고 : [[undefined와 null#null|null]]
### symbol (ES6+)
고유한 식별자를 생성하기 위한 타입. 객체 프로퍼티 키로 사용할 수 있다.
```javascript
let sym1 = Symbol();
let sym2 = Symbol();
console.log(sym1 === sym2); // false (항상 고유함)
// 객체의 프로퍼티 키로 사용
let obj = {};
let symbolKey = Symbol('myKey');
obj[symbolKey] = 'symbol value';
console.log(obj[symbolKey]); // 'symbol value'
console.log(Object.keys(obj)); // [] (Symbol 키는 열거되지 않음)
```
<!-- todo: 이게 왜 필요할까 -->
### bigint
number 타입으로 표현할 수 없는 큰 정소를 안전하게 다루기 위한 타입.
정수 뒤에 n 붙여서 표현한다.
```javascript
const bigInt1 = 123456789012345678901234567890n;
const bigInt2 = BigInt('123456789012345678901234567890');
```
## 참조 타입
### object
복합 데이터를 저장할 수 있는 타입.
객체, 배열, 함수 등 원시 타입이 아닌 모든 데이터들은 참조 타입이다.
**참조에 의해 할당되고 복사된다.**
```javascript
// 기본 객체
const person = { name: 'John', age: 30, };
// 배열
const mixed = ['string', 42, true, null];
// 함수
function greet(name) { return `Hello, ${name}!` }
// Date 객체
let now = new Date();
// 정규표현식 객체
let pattern = /hello/i;
console.log(typeof person); // 'object'
console.log(typeof mixed); // 'object'
console.log(typeof greet); // 'function'
console.log(typeof now); // 'object'
console.log(typeof pattern); // 'object'
```
## 특징
### 동적 타입
하나의 변수에 다른 타입의 값을 할당할 수 있다.
```javascript
let dynamicVar = 42; // number
console.log(typeof dynamicVar); // 'number'
dynamicVar = 'hello'; // string
console.log(typeof dynamicVar); // 'string'
dynamicVar = true; // boolean
console.log(typeof dynamicVar); // 'boolean'
dynamicVar = { name: 'John' }; // object
console.log(typeof dynamicVar); // 'object'
```
### 값에 의한 복사 vs 참조에 의한 복사
```javascript
const a = 10;
let b = a;
b = 20;
console.log(a); // 10
const obj1 = { x: 1 };
const obj2 = obj1;
obj2.x = 9;
console.log(obj1.x); // 9
```