## 자바스크립트의 데이터 타입 자바스크립트에는 총 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 ```