JavaScript 빠른 참조 — 간결한 참고서
현대 JavaScript(ES2022) 문법, 표준 라이브러리와 가장 자주 쓰는 DOM / Node 헬퍼 함수의 빠른 참조 매뉴얼로, 일상 시나리오의 약 80%를 다룹니다.
JavaScript ES2022
ECMAScript · 다중 패러다임 · 동적 · 약타입
추천 학습 경로
먼저 「Hello World와 실행 환경」(Node.js 또는 브라우저 콘솔)을 실행 → 변수, 타입, 흐름 제어에 익숙해지기 → 배열과 객체의 고급 메서드 익히기 → 참조와 복사, 함수와 클로저 이해 → 비동기(Promise/async/await) 집중 학습 → 마지막으로 필요할 때 DOM, 네트워크 fetch, Node 모듈, 빌드와 디버그를 찾아봅니다. FAQ 섹션은 돌아와서 함정을 피할 때 적합합니다.
1.Hello World 와 실행 환경
Node.js 또는 브라우저에서 JavaScript를 실행하고, 스크립트, 모듈, npm 프로젝트 구조를 이해합니다.
console 출력
console.log 는 콘솔에 출력합니다. console.error 는 오류 출력, console.table 은 표 형식으로 표시합니다. 브라우저와 Node 모두에서 사용 가능합니다.
Node 실행
node 는 .js 파일을 직접 실행합니다. node -e 는 한 줄 표현식을 실행하고, node -p 는 결과를 출력합니다. 브라우저 의존성이 없을 때 우선적으로 사용합니다.
브라우저 script
HTML 은 <script> 로 JS 를 로드합니다. defer 는 지연 실행(DOM 준비 후), async 는 비동기 로드입니다. module 타입은 ESM 을 활성화합니다.
명령행 인수
Node 에서 process.argv 는 전체 명령행을 포함합니다. argv[0] 은 node, argv[1] 은 스크립트 경로, argv[2] 부터는 인수입니다.
npm 초기화
npm init 은 package.json 프로젝트를 생성합니다. npm install 은 의존성을 설치하고 node_modules 와 lock 파일을 생성합니다.
package.json
package.json 은 프로젝트를 설명합니다. name/version, main 진입점, scripts 명령, dependencies 의존성.
ES Modules
import/export 모듈화. export 는 내보내기, import 는 가져오기. package.json 에서 type: module 을 설정하거나 .mjs 확장자를 사용합니다.
엄격 모드
"use strict" 는 엄격 모드를 활성화합니다. 암묵적 전역 변수를 금지하고, 무음 오류를 예외로 만듭니다. ESM 모듈은 자동으로 엄격 모드입니다.
2.변수와 상수
let/const 선언, 스코프, 동적 타입, 구조 분해와 템플릿 문자열.
let 과 const
let 은 변경 가능한 변수를 선언하고, const 는 상수를 선언합니다(객체 자체는 변경 가능). 블록 스코프. const 를 우선 사용하고, 변경이 필요할 때 let 을 사용합니다.
var 와 let 의 차이
var 는 함수 레벨 스코프 + 호이스팅, let/const 는 블록 레벨 스코프입니다. 모던 코드는 모두 let/const 를 사용하고 var 의 함정을 피합니다.
스코프
블록 스코프 {}, 함수 스코프, 전역 스코프. 안쪽에서 바깥쪽 변수를 읽을 수 있지만, 바깥쪽에서는 안쪽을 읽을 수 없습니다.
동적 타입
JS 변수는 타입 제약이 없습니다. 같은 변수에 임의 타입 값을 할당할 수 있습니다. typeof 는 런타임에 현재 타입을 확인합니다.
구조 분해 할당
배열/객체에서 값을 변수로 추출합니다. 객체 구조 분해는 이름 기준, 배열은 순서 기준입니다. 기본값 설정과 중첩 구조 분해가 가능합니다.
명명 규칙
변수/함수는 lowerCamelCase, 상수는 UPPER_SNAKE_CASE, 클래스/컴포넌트는 UpperCamelCase 를 사용합니다. 불리언 변수는 is/has 접두사를 사용합니다.
호이스팅
var 선언과 함수 선언은 스코프 최상단으로 호이스팅됩니다. let/const 에는 일시적 사각지대(TDZ)가 있어 선언 전에 접근하면 오류가 발생합니다.
템플릿 문자열
백틱 문자열은 ${} 보간과 여러 줄을 지원합니다. 문자열 결합과 여러 줄 텍스트 작성에 우선 사용하며, + 결합을 피합니다.
3.데이터 타입
원시 타입, 객체, typeof 판별과 타입 변환.
원시 타입
7 가지 원시 타입. string, number, boolean, null, undefined, symbol, bigint. 나머지는 모두 object 입니다.
숫자와 NaN
number 는 정수와 부동소수점을 모두 다룹니다. NaN 은 숫자가 아님을, Infinity 는 무한대를 나타냅니다. NaN 은 어떤 값과도(자기 자신 포함) 같지 않습니다.
문자열
문자열은 변경할 수 없습니다. 길이는 length, 인덱싱은 [i], 메서드는 toUpperCase/slice/split. 문자 인코딩은 UTF-16 입니다.
참 값과 거짓 값
거짓 값. false, 0, "", null, undefined, NaN. 나머지는 모두 참 값입니다. if 조건은 참 값 변환을 거칩니다.
null 과 undefined
undefined 는 정의되지 않음/할당되지 않음을 나타내고, null 은 명시적인 빈 값을 나타냅니다. 존재하지 않는 속성에 접근하면 undefined 를 반환합니다.
Symbol 과 BigInt
Symbol 은 유일한 식별자(객체 비공개 키)이고, BigInt 는 임의 정밀도의 큰 정수로 끝에 n 을 붙입니다. typeof 가 각각 식별합니다.
typeof 판별
typeof 는 원시 타입을 판별합니다. 배열/Date/null 은 모두 "object" 를 반환하므로 다른 방법으로 구분해야 합니다.
타입 변환
명시적 변환. String()/Number()/Boolean(). 암묵적 변환은 종종 함정이 됩니다. + 결합, - 연산.
객체 타입
원시 타입을 제외한 모든 것은 객체입니다. 일반 객체, 배열, 함수, Date, Map 등. 객체는 참조 타입입니다.
4.참조와 복사
값 vs 참조, 얕은 복사와 깊은 복사, 배열과 객체 참조, GC.
값 vs 참조
원시 타입은 값으로 전달(복사)되고, 객체/배열/함수는 참조로 전달(공유)됩니다. 이것은 JS 의 가장 중요한 모델입니다.
객체 참조
함수 매개변수. 객체 인자는 같은 객체를 공유하므로, 함수 안에서 멤버를 수정하면 외부에 영향을 줍니다. 기본 타입은 영향을 받지 않습니다.
얕은 복사
전개 연산자 {...obj} / [...arr] 또는 Object.assign 으로 한 단계 복사를 수행합니다. 중첩된 객체는 여전히 참조를 공유합니다.
깊은 복사
깊은 복사는 모든 레벨을 재귀적으로 복사합니다. structuredClone(모던) 또는 재귀 수기 구현. 함수/순환 참조를 포함하면 특별히 처리해야 합니다.
배열 복사
[...arr] 얕은 복사, slice() 복사, Array.from 변환. 중첩 배열(다차원)은 여전히 얕은 복사입니다.
JSON 직렬화 복사
JSON.stringify/parse 는 깊은 복사의 간단한 방법이지만, undefined/함수/Symbol 을 잃고 순환 참조는 지원하지 않습니다.
가비지 컬렉션
V8 은 참조가 없는 객체를 자동으로 회수합니다. 지역 변수는 함수가 끝나면 해제됩니다. 전역/클로저가 보유하면 수명이 늘어납니다.
객체 동등 비교
=== 는 객체의 참조를 비교하며 내용을 비교하지 않습니다. 내용이 같은 두 객체도 같지 않습니다. 필드별 비교는 수동으로 깊은 비교를 해야 합니다.
5.제어 흐름
if/else, 반복, switch, 삼항 연산과 논리 단축 평가.
if / else
if/else 는 조건에 따라 분기하며, 조건은 참 값 변환을 거칩니다. else-if 체인으로 다중 분기가 가능합니다.
삼항 연산자
cond ? a : b 는 한 줄 조건부 할당입니다. 중첩된 삼항은 가독성이 떨어지므로, 복잡한 로직은 if/switch 를 사용합니다.
for 반복문
고전적인 for 는 인덱스를 사용합니다. 대부분의 컬렉션 시나리오에서는 for...of 또는 배열 메서드가 더 간결합니다.
for...of
for...of 는 이터러블 객체(배열, 문자열, Map/Set, NodeList)를 순회합니다. 인덱스가 필요 없습니다.
for...in 객체
for...in 은 객체의 열거 가능한 키(상속 포함)를 순회합니다. 배열은 for...of 를 사용하고, 객체 키를 순회할 때는 Object.keys 를 사용합니다.
while / do-while
while 은 먼저 판단 후 실행하고, do-while 은 최소 한 번 실행합니다. 반복 횟수를 모르는 시나리오에 사용합니다.
switch
switch 는 엄격한 등호 === 로 비교합니다. case 가 일치하면 break 까지 실행됩니다. fall-through(break 누락)에 주의하세요.
논리 단락과 옵셔널 체이닝
&& || ?? 단락 평가. ?. 옵셔널 체이닝으로 안전하게 접근, ?? null 병합 (null/undefined일 때만 폴백).
break와 continue
continue는 현재 반복을 건너뛰고, break는 루프를 빠져나가며, 레이블이 붙은 break/continue는 중첩 루프를 제어합니다.
6.함수와 클로저
함수 선언, 화살표 함수, 매개변수, 클로저, this와 콜백.
함수 선언과 표현식
함수 선언은 호이스팅되고 함수 표현식은 호이스팅되지 않습니다. 화살표 함수는 더 간결한 표현식입니다. 셋의 문법이 다릅니다.
화살표 함수
화살표 함수: 간결한 단축형, 자체 this/arguments 없음, 생성자로 사용 불가. 단일 표현식은 암묵적 반환.
매개변수와 기본값
함수 매개변수는 기본값을 설정할 수 있고, rest는 나머지 매개변수를 수집합니다. arguments는 유사 배열 객체입니다 (화살표 함수에는 없음).
클로저
클로저는 함수가 생성 당시의 스코프를 기억하게 합니다. 내부 함수가 외부 변수에 접근할 수 있으며, 외부 함수가 이미 반환되었어도 가능합니다.
this 바인딩
this는 호출 시점에 결정됩니다. 객체 메서드는 객체를 가리키고, 일반 함수는 비엄격 모드에서 전역을 가리키며, 화살표 함수는 외부의 this를 상속합니다.
call / apply / bind
call/apply는 즉시 호출하며 this를 지정하고, bind는 this가 바인딩된 새 함수를 반환합니다. apply는 인자를 배열로 전달합니다.
콜백 함수
콜백은 비동기 작업에 함수로 전달하는 방식입니다. 모던 코드에서는 Promise/async를 우선 사용하세요. 콜백이 다중 중첩되면 콜백 지옥이 됩니다.
IIFE 즉시 실행
IIFE (function(){})()는 즉시 실행되어 스코프를 격리합니다. 모던 코드에서는 블록 스코프 {}나 모듈로 대체합니다.
재귀
함수가 자기 자신을 호출하려면 기저 조건이 필요하며, 없으면 스택 오버플로가 발생합니다. 꼬리 재귀 최적화는 대부분의 JS 엔진에서 완전히 지원되지 않습니다.
7.문자열 처리
문자열 메서드, 템플릿 문자열, 정규식 매칭, 분할과 문자 처리.
주요 메서드
주요 메서드: length 길이, slice/substring 추출, indexOf 검색, includes 포함 여부, replace 치환, split 분할, trim 공백 제거.
대소문자와 인코딩
toUpperCase/toLowerCase는 대소문자를 변환합니다. charCodeAt는 코드 포인트를 반환하고, fromCharCode는 그 반대입니다. localeCompare로 비교합니다.
Unicode 처리
문자열은 UTF-16 코드 유닛 시퀀스이며, Emoji 등 보충 평면 문자는 2개의 코드 유닛을 차지합니다. 순회는 for...of 또는 Array.from을 사용합니다.
템플릿 문자열 연결
템플릿 문자열의 ${} 보간과 멀티라인이 가장 권장됩니다. 표현식이나 메서드 호출을 중첩할 수 있습니다.
정규식 기초
정규식 리터럴 /pattern/ 또는 new RegExp. test는 판별, exec는 매칭. g는 전역, i는 대소문자 무시.
정규식 치환
replace는 정규식으로 치환하며 $1로 그룹을 참조합니다. 복잡한 로직은 치환 콜백으로 처리합니다. replaceAll은 모든 리터럴을 치환합니다.
분할과 결합
split은 구분자로 배열을 분할하고, join은 다시 문자열로 결합합니다. split('')은 글자 단위 분할입니다. 빈 문자열로 분할할 때의 동작에 주의하세요.
숫자를 문자열로
toString 또는 템플릿으로 문자열 변환, toFixed는 소수 자릿수, toLocaleString은 천 단위 구분, padStart는 0으로 채웁니다.
8.배열과 객체
배열 고차 메서드, Map/Set, 객체 연산과 디스트럭처링.
배열 고차 메서드
map 매핑, filter 필터링, reduce 축약, find 검색, some/every 판별. 원본 배열은 수정하지 않습니다.
Map
Map은 임의 키 매핑입니다. get/set/has/delete/size. 키로 객체를 사용할 수 있습니다. 반복은 삽입 순서를 유지합니다.
Set
Set은 중복 제거 컬렉션입니다. add/has/delete/size. 배열 중복 제거와 멤버 판별에 우선 사용됩니다.
객체 연산
Object.keys/values/entries로 순회. Object.assign으로 병합. Object.freeze로 동결. in으로 속성을 판별합니다.
reduce 축약
reduce는 배열을 단일 값으로 축약합니다. 누적, 그룹화, 평탄화에 사용합니다. 초기값 매개변수는 선택이지만 제공을 권장합니다.
정렬
sort는 기본적으로 문자열 기준으로 정렬합니다 (함정). 숫자 정렬에는 비교 함수가 필요합니다. sort는 배열을 제자리에서 수정합니다.
전개와 병합
전개 연산자 ...는 배열/객체 병합, 복사, 매개변수 전개를 수행합니다. Rest 수집과 Spread 전개는 대칭 관계입니다.
메서드 체이닝
map/filter 등이 새 배열을 반환해 체이닝할 수 있습니다. 다량의 연산 시 중간 배열 할당에 주의하세요.
배열 홀과 희소 배열
배열 홀(hole)은 undefined와 다릅니다. map은 홀을 건너뜁니다. 밀집 배열은 Array.from이나 fill을 사용합니다.
9.메모리와 성능
클로저와 메모리 누수, WeakMap/WeakSet, 대용량 데이터 처리와 최적화.
클로저 메모리
클로저는 외부 변수를 참조하며 유지합니다. 변수가 더 이상 필요하지 않더라도 그렇습니다. 장기적으로 살아 있는 참조는 GC를 방해합니다.
이벤트 리스너 누수
DOM 요소가 제거되어도 리스너가 여전히 참조하거나, 리스너가 외부 객체를 잡고 있으면 누수가 발생합니다. 요소 제거 전에 리스너를 해제하거나 스로틀링하세요.
WeakMap / WeakSet
WeakMap의 키는 약한 참조입니다. 객체에 다른 참조가 없으면 회수됩니다. 연결 데이터, 캐시, 비공개 필드에 적합합니다.
성능 최적화
불필요한 복사와 반복 계산을 피하세요. length를 지역 변수로 캐시하고, DOM 연산을 묶어 처리하며, 고빈도 이벤트는 디바운스/스로틀링하세요.
스택 오버플로
무한 재귀 또는 깊은 재귀는 RangeError: Maximum call stack을 유발합니다. 루프로 바꾸거나 깊이를 제한하세요.
대용량 데이터 처리
대용량 배열의 reduce/map은 전체 할당으로 메모리를 소모합니다. 배치 처리, 제너레이터의 지연 평가, TypedArray의 바이너리 최적화를 사용하세요.
GC와 전역 객체
전역 변수나 캐시는 절대 해제되지 않습니다. 무제한 캐시를 피하고 적시에 정리하세요. 모던 V8의 마크-스윕이 자동 처리합니다.
메모이제이션 캐시
Map으로 순수 함수의 계산 결과를 캐시하여, 같은 인자는 캐시를 즉시 반환하고 비싼 중복 계산을 피하세요. 캐시 점유에 주의하세요.
10.객체 지향
class 문법, 상속, 캡슐화, 정적 멤버와 프로토타입 체인.
class 정의
class는 객체 템플릿을 정의합니다. constructor 생성, 메서드, 속성. new로 인스턴스를 만듭니다.
상속 extends
extends로 상속하고, super()는 부모 생성자를, super.method()는 부모 메서드를 호출합니다.
getter / setter
get/set은 접근자 속성을 정의합니다. 읽기/쓰기 시 로직을 실행하고 검증을 추가합니다. 메서드가 아닌 속성처럼 접근합니다.
정적 멤버
static 멤버는 인스턴스가 아닌 클래스에 속합니다. 정적 메서드는 유틸리티 함수, 정적 속성은 상수입니다. static {} 정적 블록으로 초기화합니다.
private 필드
# 접두사로 비공개 필드/메서드 정의: 클래스 외부에서 접근하면 오류 발생. 진정한 캡슐화(관례적 밑줄이 아님).
instanceof 판별
instanceof는 객체가 특정 클래스 또는 그 부모 체인에 속하는지 판별합니다. Object.getPrototypeOf로 프로토타입을 확인합니다.
프로토타입 체인
객체는 프로토타입 체인을 통해 메서드를 공유합니다. class는 프로토타입 상속의 문법적 설탕입니다. prototype을 수정하면 모든 인스턴스에 영향을 줍니다.
조합이 상속보다 낫다
깊은 상속 체인은 유지보수가 어렵습니다. 객체 조합을 사용하세요: 생성 시 의존성을 전달하고, mixin으로 기능을 결합합니다.
11.예외 처리
try/catch/finally, 오류 타입, 던지기, 비동기 오류 처리.
try / catch / finally
try는 오류가 발생할 수 있는 코드를 담고, catch는 잡아내며, finally는 성공/실패와 관계없이 실행됩니다. 예외는 호출 스택을 따라 전파됩니다.
오류 타입
Error 기본 클래스와 그 서브클래스: TypeError, ReferenceError, RangeError, SyntaxError. instanceof로 구분합니다.
오류 던지기
throw new Error('msg')로 예외를 던집니다. 임의의 값을 던질 수 있지만, 관례적으로 Error 객체를 던집니다(스택 트레이스 포함).
사용자 정의 오류
extends Error로 비즈니스 오류를 정의합니다. 식별을 위해 name 속성을 설정하고, message와 스택 트레이스를 보존합니다.
비동기 오류
Promise/async의 오류는 .catch 또는 try/catch(await 내부)로 처리합니다. 동기 try/catch로는 비동기에서 던져진 오류를 잡을 수 없습니다.
처리되지 않은 오류
Promise에 catch가 없으면 unhandledrejection이 발생합니다. 최상위에서 uncaughtException/unhandledrejection에 대한 전역 리스너를 등록합니다.
오류 격리
일괄 처리 시 단일 실패가 전체를 중단해서는 안 됩니다. 항목별로 try/catch를 적용하거나, catch 후 기록하고 계속 진행합니다.
오류 원인 cause
ES2022에서 추가된 Error cause 옵션은 오류를 래핑할 때 하위 원인과 스택 트레이스를 보존하여 단계별 디버깅을 용이하게 합니다.
12.파일과 IO
Node 파일 시스템, 콘솔 입력, JSON 읽기/쓰기, 그리고 브라우저 DOM IO.
fs 파일 읽기
Node fs/promises로 파일을 읽습니다: readFile은 전체 읽기, readFileSync는 동기 버전입니다. 최신 코드에서는 Promise 버전을 우선 사용하세요.
fs 쓰기와 추가
writeFile은 덮어쓰기, appendFile은 추가, mkdir은 디렉터리 생성, exists는 존재 여부 확인입니다. rename/cp/rm으로 파일 작업을 수행합니다.
JSON 파일 읽기/쓰기
JSON 파일 읽기는 parse, 객체 쓰기는 stringify입니다. JSON은 설정과 데이터를 저장할 때 자주 사용됩니다.
표준 입력/출력
process.stdin은 입력(스트림) 읽기, readline은 줄 단위 상호작용, process.stdout.write는 출력입니다.
fetch 네트워크 IO
fetch는 원격 리소스를 읽습니다. async/await로 응답을 처리하고, res.json()/res.text()로 파싱합니다. Node 18+에 내장되어 있습니다.
브라우저 DOM IO
DOM으로 페이지 내용을 읽고 씁니다: getElementById로 찾기, textContent는 텍스트, innerHTML은 마크업입니다. 브라우저 환경에서만 사용 가능합니다.
스트리밍 IO
대용량 파일은 스트림을 사용해 메모리에 한꺼번에 읽어들이지 않습니다. createReadStream/createWriteStream, pipe 또는 for await를 사용합니다.
path 경로 처리
node:path로 파일 경로를 처리합니다: join은 결합, resolve는 절대 경로 변환, extname은 확장자, basename은 파일 이름입니다.
13.자주 겪는 함정(FAQ)
JS 개발자가 가장 자주 겪는 함정: == vs ===, this, 비동기, 복사와 truthy.
== 과 ===
==는 암시적 변환을 수행하므로(오류 발생 가능) ===는 엄격한 동등 비교입니다. 항상 ===를 사용하세요. null == undefined인 경우만 예외입니다.
this 손실
메서드를 변수에 할당하거나 콜백으로 전달하면 this가 더 이상 객체를 가리키지 않습니다. 화살표 함수는 외부의 this를 캡처하며, bind는 명시적으로 바인딩합니다.
부동소수점 정밀도
0.1 + 0.2 !== 0.3(이진수 표현이 정확하지 않음). 비교에는 허용 오차를 사용하고, 금액은 정수 센트 단위 또는 라이브러리를 사용하세요.
비동기 실행 순서
setTimeout과 네트워크 요청은 비동기이며, 코드를 동기 순서로 작성해도 실행 순서가 보장되지 않습니다. await/Promise를 사용하세요.
얕은 복사와 깊은 복사
전개 연산자는 한 단계만 복사하며, 중첩된 객체는 여전히 공유됩니다. 중첩 객체를 수정하면 원본 객체에 영향을 줍니다.
truthy 판별
빈 배열과 빈 객체는 truthy입니다. 배열이 비었는지 확인하려면 .length를, 객체가 비었는지 확인하려면 Object.keys().length를 사용하세요.
var 스코프 누수
var에는 블록 스코프가 없으므로, 반복문/if 안에서 선언하면 함수 스코프로 누출됩니다. 반복문 변수는 let을 사용하세요.
parseInt 함정
parseInt('08')은 오래된 엔진에서 8진수로 처리되나요? parseInt('3px')는 3을 반환합니다. 엄격한 파싱에는 Number 또는 +를 사용하세요.
중첩 삼항 연산
다층 삼항 연산은 읽기 어렵습니다. 복잡한 분기에는 if/else 또는 객체 매핑을 사용하세요.
객체 속성 변경
객체 구조 분해는 얕은 복사이며, 중첩 속성은 여전히 참조입니다. 원본 객체가 변경되지 않도록 하려면 깊은 복사가 필요합니다.
14.비동기와 이벤트 루프
이벤트 루프, Promise, async/await, 타이머와 동시성.
이벤트 루프
JS는 단일 스레드 + 이벤트 루프입니다. 동기 코드가 먼저 실행되고, 비동기 콜백(타이머/IO)은 작업 큐에 들어갔다가 처리됩니다.
Promise
Promise는 비동기 결과를 나타냅니다. then은 성공 처리, catch는 실패 처리, finally는 마무리입니다. 체이닝으로 콜백 지옥을 피합니다.
async / await
async 함수는 Promise를 반환하고, await는 결과를 기다리며 동기 코드처럼 작성되게 합니다. try/catch로 비동기 오류를 잡습니다.
타이머
setTimeout은 지연 실행, setInterval은 주기 실행, clearTimeout/clearInterval은 취소입니다. 지연 단위는 밀리초입니다.
Promise 조합
Promise.all은 모두 성공해야 성공, allSettled는 모두 완료된 후 각자의 상태를 보고, race는 먼저 완료된 것이 승리합니다.
Web Worker
Worker는 독립 스레드에서 시간이 오래 걸리는 코드를 실행해 UI를 차단하지 않습니다. postMessage로 통신합니다. Node에서는 worker_threads를 사용합니다.
동시성 제어
일괄 비동기 작업의 동시 실행 수를 제한해 리소스 고갈을 방지합니다. 배치 처리 또는 세마포어를 사용합니다.
마이크로태스크와 매크로태스크
마이크로태스크(Promise.then, queueMicrotask)는 매크로태스크(타이머)보다 우선합니다. 같은 사이클 내에서 마이크로태스크가 먼저 비워집니다.
15.네트워크와 HTTP
fetch 요청, HTTP 메서드, 오류 처리, JSON, WebSocket, URL.
fetch 기초
fetch는 HTTP 요청을 보내 Promise를 반환합니다. res.ok로 성공을 판별하고, res.json()/text()로 읽습니다. Node 18+와 브라우저에 내장되어 있습니다.
POST와 요청 본문
fetch의 두 번째 인자로 method, headers, body를 설정합니다. JSON 요청 본문은 JSON.stringify가 필요합니다.
쿼리 매개변수
URLSearchParams로 쿼리 문자열을 구성합니다. encodeURIComponent는 특수 문자를 인코딩합니다. URL 파싱.
네트워크 오류 처리
fetch는 네트워크 계층에서 실패할 때만 reject되며(연결 끊김), HTTP 4xx/5xx는 오류를 던지지 않으므로 res.ok를 확인해야 합니다. 타임아웃은 AbortController를 사용합니다.
WebSocket
WebSocket은 전이중 장기간 연결입니다. onopen/onmessage/onclose 이벤트, send로 전송합니다. 실시간 푸시 시나리오.
axios 비교
axios는 인터셉터, 자동 JSON, 더 친화적인 오류 객체를 제공합니다. fetch는 표준이고 axios는 서드파티 라이브러리입니다.
HTTP 상태 코드
2xx 성공, 3xx 리다이렉트, 4xx 클라이언트 오류, 5xx 서버 오류. 일반적인 코드는 200/201/400/401/404/500.
파일 업로드 FormData
FormData로 multipart 폼을 구성하고, fetch POST로 파일과 필드를 업로드합니다. 진행률 모니터링은 XMLHttpRequest가 더 편리합니다.
16.날짜와 시간
Date, 타임스탬프, 형식화, 시간대와 타이머.
Date 기본
new Date() 현재 시간, getFullYear/getMonth(0부터 시작)/getDate. month는 0 기반 인덱스입니다.
타임스탬프
Date.now() 밀리초 타임스탬프(UTC 에포크). getTime()도 동일. 시간대를 넘나드는 저장은 타임스탬프 또는 ISO를 사용합니다.
형식화된 출력
toLocaleDateString/toLocaleString 로케일 형식. Intl.DateTimeFormat으로 정밀 제어.
시간대
getTime은 UTC 시간점이고, 로컬 메서드(getHours)는 런타임 시간대를 기준으로 표시됩니다. 저장은 ISO/타임스탬프를 사용합니다.
시간 차이
두 Date를 빼면 밀리초 차이가 나옵니다. 초/분/시로 환산합니다. 성능 측정은 performance.now가 더 정밀합니다.
날짜 연산
일/월을 더할 때는 setDate/setMonth 또는 밀리초 연산을 사용합니다. 월의 0 기반과 월 경계를 주의합니다.
날짜 파싱
new Date(string)은 날짜 문자열을 파싱합니다. ISO 형식이 가장 안정적입니다('2024-01-01T12:00:00Z'). 다른 형식은 호환성 차이가 있습니다.
Intl 형식화
Intl.NumberFormat은 숫자/통화, Intl.DateTimeFormat은 날짜. 지역에 맞춰 로컬라이즈된 출력을 제공합니다.
17.Node 프로세스
process 환경 변수, 매개변수, 종료 코드, 현재 디렉터리와 프로세스 정보.
환경 변수
process.env는 환경 변수를 읽습니다(Node). process.env.NODE_ENV는 일반적입니다. 크로스 플랫폼은 .env 파일로 설정합니다.
명령행 인수
process.argv는 원본 매개변수입니다. 옵션 파싱은 commander/yargs 라이브러리를 사용할 수 있으며, 단순한 시나리오는 직접 작성합니다.
종료 코드
process.exit(code)는 종료하며 반환 코드(0 성공, 0 외 실패)를 가집니다. 잡히지 않은 예외의 기본 코드는 1입니다.
현재 디렉터리와 경로
process.cwd() 현재 작업 디렉터리, __dirname 모듈 디렉터리, __filename 모듈 파일(CJS).
프로세스 시그널
SIGINT(Ctrl+C), SIGTERM(kill 기본) 시그널 처리, 우아한 종료(데이터 저장, 연결 해제).
프로세스 정보
process.pid 프로세스 ID, process.uptime() 실행 초, process.memoryUsage() 메모리, process.platform 플랫폼.
표준 스트림
process.stdin/stdout/stderr 세 가지 스트림. 파이프 데이터 처리, 출력 리다이렉트와 파이프 연동.
자식 프로세스 child_process
child_process는 외부 명령을 실행합니다: exec은 출력을 가져오고, spawn은 스트림 방식으로 상호작용하며, fork는 JS 스크립트를 실행합니다. 셸 인젝션에 주의합니다.
18.정규 표현식
정규 표현식 리터럴, 매칭, 캡처 그룹, 치환과 일반적인 패턴.
정규 표현식 문법
리터럴 /pattern/과 new RegExp. \d 숫자, \w 단어 문자, \s 공백, [] 문자 클래스, {} 수량자.
정규 표현식 플래그
g 전역, i 대소문자 무시, m 다중 행(^$가 행과 매칭), s dotAll(.이 줄바꿈과 매칭), u 유니코드.
test와 match
test는 불리언을 반환하고, match는 매칭 결과를 반환하며, matchAll은 전체를 순회합니다. exec은 단일 매칭에 lastIndex가 있습니다.
캡처 그룹
괄호는 캡처, match[1]로 그룹을 가져오고, 명명된 그룹 (?<name>...)은 match.groups.name을 사용합니다. 비캡처 그룹 (?:...).
정규식 치환
replace는 $1/$<name> 그룹 참조, 콜백 함수를 지원합니다. replaceAll은 전체를 치환합니다(g 의미).
일반적인 패턴
이메일, URL, IP, 휴대폰 번호, 순수 숫자/문자. 프로덕션 검증은 화이트리스트와 함께 사용하면 더 안정적입니다.
정규 표현식 성능
재앙적 백트래킹(중첩 수량자)을 피합니다. 긴 입력은 미리 컴파일된 정규 표현식을 사용합니다. 필요시 문자열 메서드로 대체합니다.
전방탐색과 후방탐색
어서션은 위치만 매칭하고 문자를 소비하지 않습니다: 전방탐색 (?=), 부정 전방탐색 (?!), 후방탐색 (?<=). 비밀번호와 경계 검증에 적합합니다.
19.빌드와 디버그
npm 스크립트, 번들러, 디버그, 테스트와 코드 스타일.
npm 스크립트
package.json scripts에서 일반적인 명령을 정의합니다. npm run으로 실행. &&로 연결, pre/post 훅.
번들러
Vite(현대적 권장), webpack, Rollup, esbuild가 ES 모듈을 브라우저에서 실행 가능한 코드로 번들합니다.
디버그
console 단계, debugger 중단점, Node --inspect 디버거. source map으로 소스 코드 위치 파악.
테스트
Vitest/Jest 단위 테스트: describe 그룹, test/it 케이스, expect 단언. npm test로 실행.
코드 스타일 ESLint
ESLint는 구문과 스타일을 검사하고, Prettier는 형식을 통일합니다. pre-commit 훅으로 자동 검사.
TypeScript 통합
TS는 타입을 추가합니다. tsc 컴파일, ts-node/tsx로 직접 실행. Vite는 .ts를 기본 지원합니다.
CI와 배포
CI는 테스트와 빌드를 자동 실행합니다. GitHub Actions 등 플랫폼 workflow 설정. 산출물을 정적 호스팅/컨테이너에 배포.
ESM과 CJS
두 가지 모듈 시스템: ESM 정적 import는 tree-shake 가능, CJS 동적 require는 런타임 로드. type 필드가 기본값을 제어합니다.
이 치트시트에 대해
이 페이지는 ECMAScript 2022(JavaScript)의 자체 완결적인 빠른 참조 매뉴얼로, 언어 코어와 브라우저/Node의 일반적인 API가 실제 프로젝트에서 사용되는 약 80%의 일반적인 사용법을 다룹니다. 내용은 현대적 관용구를 지향합니다: let/const 블록 스코프, 화살표 함수, 템플릿 문자열, 구조 분해 할당, 전개 연산자, Promise와 async/await, 옵셔널 체이닝과 null 병합. JavaScript는 Brendan Eich가 1995년에 Netscape에서 발명했으며, 현재 모든 브라우저가 기본적으로 지원하는 유일한 언어로서 웹 프론트엔드, Node.js 서버, 데스크톱 애플리케이션의 기반입니다. 19개 섹션은 각각 하나의 주제에 집중합니다: 기본 문법, 변수와 스코프, 타입, 참조와 값 의미, 제어 흐름, 함수와 클로저, 문자열, 배열과 객체, 메모리와 가비지 컬렉션, 프로토타입과 클래스, 오류 처리, 입출력, 일반적인 함정, 동시성(이벤트 루프), 네트워크(fetch), 시간, 프로세스, 정규 표현식과 빌드 도구. 각 소절에는 「개념 소개 + 바로 복사 가능한 코드 스니펫」이 함께 제공됩니다. 모든 코드와 텍스트는 브라우저에서 로컬로 렌더링되며, 어떤 데이터도 기기를 떠나지 않습니다. 권위 있는 참고 자료는 MDN Web Docs를 보세요.
버전 2.1.0