| 분류 | 프로그래밍 언어, 스크립트 언어, 범용 프로그래밍 언어 |
| 설계자 | 브렌던 아이크 |
| 개발사 | Netscape |
| 최초 공개 | 1995년 |
| 표준 | ECMAScript, ECMA-262 |
| 표준화 기구 | Ecma International TC39 |
| 패러다임 | 명령형, 함수형, 객체 지향, 이벤트 구동 |
| 타입 체계 | 동적 타입, 약한 타입 |
| 객체 모델 | 프로토타입 기반 |
| 주요 구현체 | V8, SpiderMonkey, JavaScriptCore, Chakra |
| 주요 실행 환경 | 웹 브라우저, Node.js, Deno, Bun |
| 파일 확장자 | .js, .mjs, .cjs |
JavaScript는 동적 타입과 프로토타입 기반 객체 모델, 일급 함수와 자동 메모리 관리를 제공하는 범용 프로그래밍 언어이다. 1995년 Netscape에서 브렌던 아이크가 웹 페이지에 프로그램 동작을 추가하기 위한 언어로 개발했으며, 이후 웹 브라우저에서 실행되는 대표적인 스크립트 언어로 자리 잡았다. 현재는 웹 프론트엔드뿐 아니라 서버, 명령줄 도구, 데스크톱 및 모바일 응용 프로그램, 개발 도구와 임베디드 시스템에서도 사용된다.
JavaScript의 표준화된 핵심 언어는 ECMAScript라고 한다. ECMAScript는 언어의 문법과 타입, 객체, 함수, 실행 문맥, 모듈, 비동기 연산과 표준 내장 객체의 동작을 정의하며, Ecma International의 기술 위원회 TC39가 ECMA-262 표준으로 개발한다. JavaScript는 Netscape의 원래 구현에서 시작된 이름이지만, 현재는 ECMAScript 표준을 구현한 언어와 그 주변 생태계를 가리키는 일반적인 명칭으로 사용된다.
JavaScript는 C 계열 언어와 유사한 블록 문법을 사용하지만, Java와는 별개의 언어이다. 객체는 기본적으로 다른 객체를 프로토타입으로 참조하며, 함수도 변수에 저장하거나 다른 함수에 전달하고 반환할 수 있는 객체로 취급된다. class 문법도 별도의 클래스 기반 객체 체계를 만드는 것이 아니라 기존 프로토타입 모델을 기반으로 동작한다.
언어의 주요 타입에는 Undefined, Null, Boolean, String, Symbol, Number, BigInt와 Object가 있다. 변수 자체에 고정된 타입이 지정되는 대신 실행 중 변수에 저장된 값이 타입을 가지며, 연산 과정에서는 문맥에 따른 암시적 타입 변환이 일어날 수 있다. 이러한 유연성은 간결한 프로그램 작성을 가능하게 하는 한편, 대규모 개발에서는 정적 분석이나 TypeScript와 같은 점진적 타입 언어를 함께 사용하는 배경이 되었다.
JavaScript 언어 자체와 실행 환경이 제공하는 기능은 구분된다. ECMAScript 표준은 핵심 언어와 표준 내장 객체를 정의하지만, 문서 조작, 사용자 입력, 네트워크 통신과 파일 시스템 접근 같은 기능은 호스트 환경이 제공한다. 웹 브라우저에서는 DOM, 이벤트, Fetch와 저장소를 포함하는 Web API를 사용할 수 있으며, Node.js에서는 파일 시스템, 네트워크, 프로세스와 운영체제 연동 기능을 사용할 수 있다. 따라서 window, document, process처럼 널리 사용되는 객체도 JavaScript 언어 자체가 아니라 특정 실행 환경에 속한다.
초기의 JavaScript는 웹 페이지 안에서 짧은 동작을 실행하는 언어로 인식되었으나, 브라우저 엔진의 성능 향상과 표준화, Ajax, 모듈 시스템, 비동기 프로그래밍 기능과 패키지 생태계의 발전을 거치며 대규모 웹 응용 프로그램을 구성하는 언어로 확장되었다. 2009년에 등장한 Node.js는 브라우저 밖에서도 JavaScript를 범용적으로 실행하는 환경을 제공했고, 서버와 명령줄 프로그램 개발까지 생태계를 확장했다. 이후 JavaScript는 웹 플랫폼을 중심으로 여러 운영체제와 실행 환경을 연결하는 주요 소프트웨어 기술로 발전했다.
역사
탄생 이전의 웹
Mocha의 개발
LiveScript와 JavaScript
Netscape Navigator와 초기 보급
Microsoft JScript와 브라우저 경쟁
ECMAScript 표준화
ECMAScript 2와 ECMAScript 3
ECMAScript 4의 개발과 중단
Ajax와 웹 응용 프로그램
ECMAScript 5
Node.js의 등장
ECMAScript 2015
연례 표준화 체계
현대 JavaScript 생태계
명칭과 표준
JavaScript라는 명칭
Java와의 관계
ECMAScript
ECMA-262
ECMA-402
TC39
표준 제안 절차
연례 명세
명세와 구현의 관계
언어 설계
설계 목표
다중 패러다임
동적 타입
프로토타입 기반 객체 지향
일급 함수
클로저
자동 메모리 관리
실행 문맥과 어휘 환경
어휘 구조와 문법
문자 집합과 소스 텍스트
식별자와 예약어
리터럴
문과 표현식
연산자
블록과 제어문
주석
세미콜론 자동 삽입
엄격 모드
변수와 영역
var
let
const
함수 영역
블록 영역
어휘적 영역
호이스팅
전역 객체
전역 선언
타입 체계
원시 값과 객체
Undefined
Null
Boolean
Number
BigInt
String
Symbol
Object
동적 타입
약한 타입
암시적 타입 변환
타입 검사
동등성 비교
객체 모델
객체와 속성
속성 키
속성 설명자
프로토타입
프로토타입 체인
객체 생성
생성자와 new
this
클래스 문법
상속
비공개 필드
Proxy와 Reflect
함수
함수 선언
함수 표현식
화살표 함수
매개변수
나머지 매개변수
기본 매개변수
반환 값
일급 함수
고차 함수
클로저
재귀
Generator
비동기 함수
문법 확장
객체 리터럴
배열 리터럴
템플릿 리터럴
구조 분해 할당
전개 문법
선택적 연결
Null 병합 연산자
클래스 필드
정적 초기화 블록
실행 모델
스크립트와 모듈
실행 문맥
호출 스택
Realm
Agent
Job
작업 큐
호스트 환경
예외 처리
비동기 프로그래밍
콜백
이벤트 루프
Promise
Promise 작업
async와 await
마이크로태스크
비동기 반복
비동기 Generator
Worker
공유 메모리와 Atomics
모듈 시스템
초기 모듈 패턴
CommonJS
AMD
UMD
ECMAScript Modules
import
export
동적 가져오기
모듈 해석
순환 의존성
브라우저 모듈
Node.js 모듈
표준 내장 객체
Object
Function
Array
Map과 Set
WeakMap과 WeakSet
TypedArray
ArrayBuffer와 DataView
String
RegExp
Date
JSON
Math
Promise
Iterator
Error
Intl
Temporal
호스트 환경
웹 브라우저
Web API
Document Object Model
이벤트
네트워크 API
Web Worker
Service Worker
Node.js
Deno
Bun
명령줄 셸
임베디드 실행 환경
구현체와 엔진
인터프리터와 JIT 컴파일
V8
SpiderMonkey
JavaScriptCore
Chakra
QuickJS
Hermes
인라인 캐시
숨겨진 클래스
가비지 컬렉션
최적화와 디옵티마이제이션
웹 플랫폼
HTML과의 통합
DOM 조작
이벤트 처리
네트워크 통신
클라이언트 저장소
그래픽과 멀티미디어
Web Components
WebAssembly 연동
점진적 향상
브라우저 호환성
서버 측 JavaScript
Node.js 실행 모델
파일 시스템
네트워크 프로그래밍
HTTP 서버
스트림
프로세스 관리
명령줄 프로그램
실시간 응용 프로그램
서버리스 컴퓨팅
엣지 런타임
개발 도구
브라우저 개발자 도구
REPL
디버거
린터
코드 포매터
트랜스파일러
번들러
테스트 도구
프로파일러
소스 맵
언어 서버
패키지 생태계
npm
패키지 레지스트리
package.json
의존성 관리
의미적 버전 관리
잠금 파일
패키지 배포
프론트엔드 프레임워크
서버 프레임워크
빌드 도구
공급망 보안
TypeScript와 확장 언어
TypeScript
점진적 타입
타입 선언
JSX
JavaScript와의 상호 운용
JavaScript를 대상으로 하는 언어
트랜스파일
보안
샌드박스
동일 출처 정책
교차 사이트 스크립팅
코드 주입
동적 코드 실행
프로토타입 오염
패키지 공급망 공격
서버 측 보안
권한 기반 실행 환경
성능
실행 엔진 최적화
초기 실행 시간
메모리 관리
이벤트 루프 지연
비동기 입출력
DOM 작업 비용
번들 크기
프로파일링
WebAssembly와 네이티브 확장
활용 분야
웹 프론트엔드
백엔드와 API 서버
데스크톱 응용 프로그램
모바일 응용 프로그램
명령줄 도구
게임
데이터 시각화
자동화
클라우드와 서버리스
임베디드 시스템
교육
다른 프로그래밍 언어와의 관계
Self
Scheme
C와 C++
Java
Python
PHP
TypeScript
WebAssembly
다른 언어의 컴파일 대상
다른 언어에 미친 영향
표준화와 호환성
Test262
구현 적합성
기능 감지
Polyfill
트랜스파일
레거시 웹 호환성
브라우저별 차이
런타임별 차이
영향
동적 웹의 확산
웹 응용 프로그램의 성장
브라우저 엔진 경쟁
JSON의 보급
비동기 프로그래밍
전체 스택 개발
크로스 플랫폼 응용 프로그램
패키지 생태계
장점과 한계
관련 문서