JavaScript

JavaScript는 동적 타입과 프로토타입 기반 객체 모델, 일급 함수와 자동 메모리 관리를 제공하는 범용 프로그래밍 언어이다. 1995년 Netscape에서 브렌던 아이크가 웹 페이지에 프로그램 동작을 추가하기 위한 언어로 개발했으며, 이후 웹 브라우저에서 실행되는 대표적인 스크립트...

분류프로그래밍 언어, 스크립트 언어, 범용 프로그래밍 언어
설계자브렌던 아이크
개발사Netscape
최초 공개1995년
표준ECMAScript, ECMA-262
표준화 기구Ecma International TC39
패러다임명령형, 함수형, 객체 지향, 이벤트 구동
타입 체계동적 타입, 약한 타입
객체 모델프로토타입 기반
주요 구현체V8, SpiderMonkey, JavaScriptCore, Chakra
주요 실행 환경웹 브라우저, Node.js, Deno, Bun
파일 확장자.js, .mjs, .cjs

JavaScript는 동적 타입과 프로토타입 기반 객체 모델, 일급 함수와 자동 메모리 관리를 제공하는 범용 프로그래밍 언어이다. 1995년 Netscape에서 브렌던 아이크가 웹 페이지에 프로그램 동작을 추가하기 위한 언어로 개발했으며, 이후 웹 브라우저에서 실행되는 대표적인 스크립트 언어로 자리 잡았다. 현재는 웹 프론트엔드뿐 아니라 서버, 명령줄 도구, 데스크톱 및 모바일 응용 프로그램, 개발 도구와 임베디드 시스템에서도 사용된다.[1]

JavaScript의 표준화된 핵심 언어는 ECMAScript라고 한다. ECMAScript는 언어의 문법과 타입, 객체, 함수, 실행 문맥, 모듈, 비동기 연산과 표준 내장 객체의 동작을 정의하며, Ecma International의 기술 위원회 TC39가 ECMA-262 표준으로 개발한다. JavaScript는 Netscape의 원래 구현에서 시작된 이름이지만, 현재는 ECMAScript 표준을 구현한 언어와 그 주변 생태계를 가리키는 일반적인 명칭으로 사용된다.[2][3]

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 언어 자체가 아니라 특정 실행 환경에 속한다.[4][5]

초기의 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 작업

asyncawait

마이크로태스크

비동기 반복

비동기 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의 보급

비동기 프로그래밍

전체 스택 개발

크로스 플랫폼 응용 프로그램

패키지 생태계

장점과 한계

관련 문서

  1. ECMAScript Language Specification: Introduction
  2. ECMA-262
  3. TC39
  4. JavaScript technologies overview
  5. About Node.js