1. 데이터 타입(Data Types) 종류
JavaScript의 데이터 타입(Data Type)은 크게 primitive(기본, 원시)과 reference(참조)으로 구분합니다.

- 원시 값(언어의 최고 로우레벨에서 직접 표현되는 불변 데이터)
- Number 타입
- String 타입
- Boolean 타입
- Null 타입
- Undefined 타입
- Symbol 타입
- BigInt 타입
- 임의 정밀도로 정수를 나타낼 수 있는 JavaScript 숫자 원시 값
- Number의 안전 한계를 넘어서는 큰 정수도 안전하게 저장하고 연산
- 객체 (속성의 컬렉션)
- array
- funciton
- data
- RegExp
- Map, WeakMap
- Set, WeakSet
2. 원시타입
2.1 숫자 타입(number)
1let integer = 123 // 정수2let negative = -123 // 음수3let double = 1.23 // 실수45console.log(integer) // 1236console.log(negative) // -1237console.log(double) // 1.2389let binary = 0b1111011 // 2진수10let octal = 0o173 // 8진수11let hex = 0x7b // 16진수1213console.log(binary) // 12314console.log(octal) // 12315console.log(hex) // 1231617console.log(0 / 123) // 018console.log(123 / 0) // Infinity19console.log(123 / -0) // -Infinity20console.log(123 / 'text') // NaN (Not a Number)2122// 참고 : 정말 큰 수를 표현할 떄는 뒤에 n을 붙여야 함23let bigInt = 1234567890123456789012345678901234567890n24console.log(bigInt)
💡Infinity에 대해
cf. TED - 0으로 나누면 안되는 이유, 자막있음
0은 역수를 가질 수 없음
2.2 문자열 타입(string)
1// 문자열 타입2let string = '안녕하세요'3string = `안녕!`4console.log(string)56// 작은 따옴표 표현7string = "'안녕!'"8console.log(string)910// 특수문자 출력하는 법 : 이스케이프 표현11string = '안녕!\n나야!\t\t 내 이름은\\\u09AC'12console.log(string)1314let id = '메시'15let greetings = "'안녕!, " + id + "🖐️\n즐거운 하루 보내요!'"16console.log(greetings)
2.2.1 템플릿 리터럴(Template Literal)
1// 템플릿 리터럴(Template Literal) ``2greetings = `'안녕, ${id}🖐️3즐거운 하루 보내요!'`4console.log(greetings)
백틱으로 문자를 만드시면 문자 중간에 ${변수명} 이렇게 쉽게 넣을 수 있습니다.
- 문자 중간 엔터키 입력이 가능
- 문자 중간에 변수를 집어넣을 때 편리
- 자바스크립 문자로 HTML을 작성하실 때도 유용
2.3 불리언 타입(boolean)
1// 불리언 타입2let 참 = true3let 거짓 = false4console.log(참) // true5console.log(거짓) // false67// 활용 예:8let isFree = true9let isActivated = false10let isEntrolled = true11console.log(isActivated) // false1213console.clear()1415// Falshy 거짓인 값16console.log(!!0) // false17console.log(!!-0)18console.log(!!'')19console.log(!!null)20console.log(!!undefined)21console.log(!!NaN)2223// Truthy 참인 값24console.log(!!1) // ture25console.log(!!-1)26console.log(!!'text')27console.log(!!{})28console.log(!!Infinity)
2.4 null과 undefined 타입
undefined: 값이 있는지 없는지 모름null: 값이 없음
1// null, undefined2let variable3console.log(variable) // undefined : 값이 있는지 없는지 모름45variable = null6console.log(variable) // null : 값이 없다78let activeItem // 아직 활성화된 아이템이 있는지 없는지 모르는 상태!9activeItem = null // 활성화된 아이템이 없는 상태!1011console.log(typeof 123) // number12console.log(typeof '123') // string1314console.log(typeof null) // object : null을 표현하기 위해 만든 object가 할당됨15console.log(typeof undefined) // undefined
2.5 symbol 타입
map과 set을 배운 후에 symbol을 이해합니다. symbol(심벌)은 유일한 값을 나타날 떄, 유용하게 사용할 수 있습니다.
- Symbol은 Symbol() 함수로 생성합니다.
- 이때 생성된 Symbol은 객체가 아니라 변경 불가능한 원시 타입의 값입니다.
1let mySymbol = Symbol()23let mySymbol2 = Symbol('something')4// Symbol()에 문자열을 줄수 있는데 별다릇 뜻은 없고 주석 같은 개념이다.5// 디버깅할때 이 심볼이 어느 심볼인지 구분하기 편하게 하기 위한 장치67console.log(mySymbol) // Symbol()8console.log(typeof mySymbol) // symbol
심볼은 유일성이 보장되는 자료형이기 때문에, 설명이 동일한 심볼을 여러 개 만들어도 각 심볼값은 다릅니다.
1let id1 = Symbol('id')2let id2 = Symbol('id')34alert(id1 == id2) // false
2.5.1 Symbol.keyFor()
Symbol() 은 고유한 심볼을 반환합니다.
하지만 Symbol.for() 는 전역으로 존재하는 global symbol table 의 목록을 참조합니다.
때문에 Symbol.for(token string) 으로 정의할때, token string 으로 정의 된 심볼이 있다면, 해당 심볼을 반환하게 됩니다.
1// 전역 Symbol 레지스트리에 foo라는 키로 저장된 Symbol이 없으면 새로운 Symbol 생성2const s1 = Symbol.for('foo')34// 전역 Symbol 레지스트리에 foo라는 키로 저장된 Symbol이 있으면 해당 Symbol을 반환5const s2 = Symbol.for('foo')67console.log(s1 === s2) // true
2.5.2 Symbol.keyFor()
Symbol.keyFor은 global symbol table로부터 존재하는 Symbol의 token string을 반환합니다.
1var token = Symbol.for('tokenString')2console.log(Symbol.keyFor(token) === 'tokenString') // true
2.5.3 Symbol.description
일반 심볼 이름을 반환합니다.
1const shareSymbol = Symbol.for('myKey')2console.log(Symbol.keyFor(shareSymbol)) // myKey34const unsharedSymbol = Symbol('myKey')5console.log(Symbol.keyFor(unsharedSymbol)) // undefined6console.log(unsharedSymbol.description) // myKey
1// Symbol(심벌) : 유일한 키를 생성할 수 있음 🔑2const map = new Map()3// const key1 = 'key';4// const key2 = 'key';5const key1 = Symbol('key')6const key2 = Symbol('key')7map.set(key1, 'Hello')8console.log(map.get(key2)) // undefined9console.log(key1 === key2) // false1011// 동일한 이름으로 하나의 키를 사용하고 싶다면, Symbol.for12// 전역 심벌 레지스트리(Global Symbol Registry) = 전역적으로 심벌을 관리하고 재사용하는 곳13const k1 = Symbol.for('key')14const k2 = Symbol.for('key')15console.log(k1 === k2) // true1617console.log(Symbol.keyFor(k1)) // key18console.log(Symbol.keyFor(key1)) // undefined1920// 보안을 위해 외부에서 접근을 막는 Symbol21// 결론 : 문자열이 같아도 유니크한 키값을 만들고 싶을 떄, Symbol을 사용22const obj = { [k1]: 'Hello', [Symbol('key')]: 1 }23console.log(obj) // { [Symbol(key)]: 'Hello', [Symbol(key)]: 1 }24console.log(obj[k1]) // Hello25console.log(obj[Symbol('key')]) // undefined