최근 수정 시각 : 2025-08-14 09:14:31

JavaScript/표준


[[JavaScript|
파일:JavaScript 로고.svg
JavaScript
관련 문서
]]
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px)"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
<colbgcolor=#f7df1e,#f7df1e><colcolor=#000,#000> 관련 문서 표준(TC39 · 브라우저 전쟁) · Vanilla JS · AJAX · JSFuck · 상태관리 라이브러리 · JSON
문법 표준 내장 객체, this · undefined
구현체 <bgcolor=#f7df1e,#f7df1e> 엔진 V8 · SpiderMonkey · JavaScriptCore · 헤르메스 · Boa
<bgcolor=#f7df1e,#f7df1e> 런타임 Node.js · Deno · Bun · workerd
패키지 관리자 npm · Bun
파생 언어 TypeScript · CoffeeScript · 액션스크립트 · AssemblyScript · elm · ReasonML · ReScript
관련 인물 브랜든 아이크
기타 JavaScript npm 마비 사태 }}}}}}}}}
파일:ECMA-262_16th_edition_june_2025_cover.png
ECMA-262 16판 ECMAScript 2025 표준 문서
1. 개요2. 표준화 이전3. ECMA-262
3.1. ECMAScript 13.2. ECMAScript 23.3. ECMAScript 33.4. ECMAScript 43.5. ECMAScript 53.6. ECMAScript 5.13.7. ECMAScript 20153.8. ECMAScript 20163.9. ECMAScript 20173.10. ECMAScript 20183.11. ECMAScript 20193.12. ECMAScript 20203.13. ECMAScript 20213.14. ECMAScript 20223.15. ECMAScript 20233.16. ECMAScript 20243.17. ECMAScript 20253.18. ECMAScript 20263.19. Draft ECMA-262(ESNext)3.20. ECMA TR/104
4. 모듈 표준
4.1. CommonJS
5. 관련 문서

1. 개요

JavaScript, 구체적으로는 ECMAScript의 언어 명세 표준을 순서대로 정리한 문서.

브라우저에서 실행되는 JavaScript 뿐만 아니라 ECMAScript 표준에 기반하는 다른 호환 표준들 및 구현체들에도 영향을 끼친다.

이론적으로, JavaScript란 ECMAScript 표준을 구현하는 가장 작은(bare minimum) 구현체(implementation)의 일종이다. 현실적으로는, JavaScript란 이름의 상표권이 여전히 오라클에 있기 때문에 ECMA 측에서 법적 문제를 피하려고 표준에서 JavaScript라는 용어를 대체하기 위한 새 용어를 만들어 넣은 것에 불과하다. 본 문서에서는 편의상 후자의 인식을 따르며, 별도의 언급이 없는 한 ECMAScript와 JavaScript를 같은 개념으로 간주한다.

버전 고정의 개념이 존재하지 않는 동시에 수많은 브라우저 벤더 구현체가 공존하는 및 JavaScript 생태계의 특성상 표준과 실제 구현이 항상 일치하지 않을 수 있다는 점에 주의해야 한다. 스펙이 먼저 만들어지고 그걸 기반으로 구현체가 만들어지는 일반적인 언어들과 다르게, 대략 ES5~ES6 시점까지는 넷스케이프와 IE를 중점으로 각 벤더별로 이미 추가한 기능들을 뒤늦게 문서화하고 표준화하는 역할에 가까웠다. 현재는 표준 개정 과정 자체를 무시하고 멋대로 기능이 추가되는 것은 줄었지만 TC39 proposal이 올라온 후 아직 표준에 병합되지도 않은 기능들을 실제 상용 브라우저에서 미리 구현해 두기도 한다. 이런 경우 표준 문서에서는 찾을 수 없고 draft 스펙이나 개별 proposal의 ecmark 스펙에서 찾아야 한다.

2. 표준화 이전

파일:상세 내용 아이콘.svg   자세한 내용은 JavaScript 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[JavaScript#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[JavaScript#역사|역사]] 부분을
참고하십시오.
표준화 이전까지 가장 문제가 심했던 경우는 넷스케이프 JavaScript와 마이크로소프트 JScript의 차이로, 브라우저 전쟁 당시 이를 해결하기 위해 ES1 표준이 등장했다. 현재도 표준에 남아있는 String.prototype.fontcolor()와 같이 정신이 아득해지는 API들이 이때의 흔적들이다.[1]

3. ECMA-262

ECMAScript(JavaScript) 언어 명세로, 언어의 어휘/구문 구조(lexical/syntactic structure)와 타입 시스템, 메모리 모델 등 의미적 해석 방법(semantic), 전역 객체 및 내장 타입의 프로토타입 명세 등을 다룬다. ECMA-402도 표준에 포함되긴 하지만 ECMA-402가 ECMA-262에 의존하고,[2] 실질적 중요도가 떨어지기는 부가적 API 표준이기 때문에 ECMAScript라고 하면 실질적으로 ECMA-262만을 의미한다고 해석해도 무방하다.

ECMAScript 2015 이후 버전 기준 매년 6월마다 새 버전이 발표되며, 지난해 6월부터 해당 연도 6월까지의 기간 동안 Stage 4 단계에 들어선 TC39 제안을 모두 병합해 새 버전을 만든다.

즉, ECMA-262 Draft(ESNext)는 각 TC39 제안들이 개별적으로 단계를 올려가며 끊임없이 추가되는 living standard에 해당하고, 개별 20XX년도의 정식 표준(ECMAScript 20XX)은 draft standard의 20XX년 6월 시점의 스냅샷을 보존한 것이라고 볼 수 있다.

3.1. ECMAScript 1

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 1ES11.0발표1997년 6월#

3.2. ECMAScript 2

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2ES22.0발표1998년 8월#

3.3. ECMAScript 3

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 3ES33.0발표1999년 12월#

3.4. ECMAScript 4

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 4ES44.0취소

1999년부터 개정이 시작된 표준안이었으나 결과적으로 무산된 표준안.

당시 1차 브라우저 전쟁 시기를 거치며 수많은 이해당사자들이 얽힌 결과 ES3에 비해 추가할 기능이 너무 많아지다 못해 과거 호환성을 깨트리는 개정안이 되었고, 정작 브라우저 벤더들도 구현에 적극적으로 협조하지 않았다. 당시 ES4 표준 개정에 참여했던 벤더는 넷스케이프, 마이크로소프트, 매크로미디어(Adobe 인수 전) 등이 있었는데, 1999년 2월 당시의 ES4 개정안 초안을 보면 넷스케이프는 JavaScript 2.0를 구상하고 있었고, 마이크로소프트와 매크로미디어는 각각 자사의 .NET JScript, 플래시 ActionScript와 호환되는 방향만을 찾고 있었다.#

결국 10년 내내 논의랑 협상만 진행하다가 2008년 7월 오슬로에서 열린 회의에서 네임스페이스 등 많은 기능들을 포기하거나 개정을 늦추는 방향으로 합의가 되며 최종적으로 ES4 표준이 무산되었다.[3] 이후 ES4가 진행되는 대신 ES3 호환성을 중시하는 ES3.1 초안이 ES5로 이름이 바뀌어 발표되었고,# ES4 구상 중에 나왔던 쓸만한 아이디어들은 브랜든 아이크가 Harmony라고 명명한 ES6 표준에서 선택적으로 채택하는 것으로 결정되었다.[4]

폐기된 표준안이긴 하지만 ES4 표준 번호는 할당이 되어 있고, 때문에 ECMAScript 표준 버전은 기존 ES3에서 바로 ES5로 이어진다.[5]

3.5. ECMAScript 5

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 5ES55.0발표2009년 12월#

ES4의 무산 이후 ES3.1 개정안을 기준으로 발표된 ES3의 다음 버전. 이마저도 ES3 이후 거의 10년만에 이루어진 개정이었기 때문에 추가된 내용이 상당하다.

3.6. ECMAScript 5.1

3.7. ECMAScript 2015

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2015ES2015, ES66.0발표2015년 6월#

이 버전부터 1부터 올라가는 버전 체계를 버리고, 매년 6월마다 1년 주기로 발표하면서 버전에 해당 연도로 표기하는 체계로 바뀌었다. 다만 관습상 ES5의 바로 다음 표준이기도 하고, ES5 이후 한참 후에 등장해 현재의 모던 JavaScript를 연 표준 버전이기에 ES6, 또는 최신 표준을 ES6+로 뭉뚱그려 표현하기도 하는 편.

let/const 변수 선언 문법, 화살표 함수, 템플릿 문자열, 비구조화, 인자 기본값, 펼치기(...) 연산자, 클래스, Promise, Map/Set, 정수 0b/0o 리터럴 문법, Symbol, Proxy/Reflect, 이터레이터/제너레이터/for of 구문 등 수많은 기능이 도입되었다.

ES Module 표준도 이때 도입되었다.

3.8. ECMAScript 2016

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2016ES20167.0발표2016년 6월#

거듭제곱 연산자(**) 문법이 도입되었다.

3.9. ECMAScript 2017

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2017ES20178.0발표2017년 6월#

Object.entries(), Object.values(), 그리고 async-await 문법이 도입되었다. 또한 이때부터 함수 인자 목록에 trailing comma 사용이 가능해졌다.

3.10. ECMAScript 2018

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2018ES20189.0발표2018년 6월#

배열에만 사용이 가능하던 ... 연산자를 객체에도 사용 가능해졌으며, for await 문법이 도입되었다.

3.11. ECMAScript 2019

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2019ES201910.0발표2019년 6월#

예외처리의 try-catch에서 catch문의 에러 객체 할당을 생략할 수 있도록 바뀌었다.

3.12. ECMAScript 2020

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2020ES202011.0발표2020년 6월#

ESM 관련해서 dynamic import, import.meta, namespace export, 표준 globalThis 등 굵직한 기능들이 이때 도입되었다.

BigInt 및 BigInt 리터럴 문법, ?? 및 옵셔널 체이닝(?.) 연산자, Promise.allSettled() 등이 추가되었다.

3.13. ECMAScript 2021

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2021ES202112.0발표2021년 6월#

논리 연산자의 할당 버전인 ||=, &&=, ??= 연산자와 Promise.any()가 도입되었다. 이때부터 숫자 리터럴에서 구분자로 _을 쓸 수 있는 문법이 지원된다.

3.14. ECMAScript 2022

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2022ES202213.0발표2022년 6월#

드디어 top-level await가 구현되었다. 다만, ES Module 환경이 아닌 경우 지원되지 않을 수 있으니 주의. 이외에도 클래스 비공개 속성 문법, 배열의 음수 인덱싱을 제공하는 .at() 등등이 추가되었다.

3.15. ECMAScript 2023

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2023ES202314.0발표2023년 6월#

기존의 in-place 방식 메서드 동작을 immutable하게 구현하는 메서드들이 대거 추가되었다. 가령 .sort().toSorted()로 바꾸면 원본 배열을 변경하지 않으면서 리턴값만 정렬해서 반환한다.

3.16. ECMAScript 2024

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2024ES202415.0발표2024년 6월#

String.prototype.toWellFormed()Well-Formed 유니코드 문자열 관련 API가 도입되었다.

3.17. ECMAScript 2025

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2025ES202516.0발표2025년 6월#

Promise.try() 헬퍼, 임포트 속성 문법#3057이 도입되었다.

RegExp.escape()# 함수가 도입되었다.

3.18. ECMAScript 2026

<rowcolor=#000,#000> 정식 명칭 약칭 개정 차수 상태 발표 시기 링크
ECMAScript 2026ES202617.0초안 #

현재 draft인 표준이다. 2026년 발표될 것이 예정되어 있다.

3.19. Draft ECMA-262(ESNext)

tc39.es/ecma262 tc39/ecma262 (main 브랜치)

엄밀히 말해서 정식 표준이 아니라, 현재 한창 표준화가 진행 중인 최신 초안(current draft) 버전을 말한다.

esnext는 흔히 트랜스파일러, 번들러 등에서 쓰이는 관습적 약칭으로, ES5, ES2015, ... 처럼 ECMAScript<버전>을 ES<버전>로 줄여 부를 때 버전명 대신 next를 사용한 표현이다.

3.19.1. TC39 Proposals

파일:상세 내용 아이콘.svg   자세한 내용은 TC39 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[TC39#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[TC39#주요 제안 목록|주요 제안 목록]] 부분을
참고하십시오.
모든 ECMAScript 표준 변경사항은 제안(proposal) 단계에서부터 시작한다. 현재 ECMA-262 표준 문서에 병합되지 못한, 초안 단계의 제안들이나, 향후 표준에 반영될 가능성이 있는 제안들이다.

3.20. ECMA TR/104

ECMA TR/104 test262 엔진/표준별 커버리지

ECMA-262 표준의 구현 완성도와 커버리지를 측정하는 데 사용되는 테스트 케이스 모음(test suite). 흔히 약칭인 Test262로 불린다.

주요 파서나 엔진 구현체의 경우, 해당 테스트 코드를 벤치마크의 대상으로 삼기도 한다.

4. 모듈 표준

ES Module에 대한 내용은 ECMAScript 2015 참고.

4.1. CommonJS

2009년 케빈 덴구어가 'ServerJS'라는 이름으로 표준화를 시도한 공통 인터페이스 및 기술 표준. 이후 1년도 지나지 않아 현재 널리 알려진 CommonJS라는 이름으로 바뀌었다.

JSGI 등 여러 스펙이 있었지만 현실적으로 유의미하게 구현된 것은 모듈 인터페이스로, 해당 스펙의 하위 챕터 중 Modules에서 정의되며 현재까지 버전은 Modules/1.0, Modules/1.1, Modules/1.1.1이 존재한다. 나머지 스펙은 대부분 묻혀 사실상 'Node.js에서만 쓰이는 모듈 시스템의 이름' 정도의 인식으로 알려져 있다.

다만 ECMA-262이나 WebIDL로 기술되는 다른 API처럼 formal한 표준이 있지는 않고, Node.js를 제외한 대부분의 런타임이 ESM을 채택한 현재 사실상 Node.js의 module resolution 동작 문서 중 하나로 흡수된 상태이다.

5. 관련 문서


[1] 해당 함수가 Annex B (normative) Additional ECMAScript Features for Web Browsers에 있는 것에서부터 눈치 챘겠지만, ECMA 표준 어디에도 없는데 대부분의 브라우저에는 구현되어 있고(...), 정작 그마저도 브라우저별로 동작이 서로 미세하게 다른 이슈가 있어 동작의 통일성과 호환성을 위해 Annex B에 한해 표준에 추가된 케이스다. #[2] A conforming implementation of this specification must conform to ECMA-262, and must provide and support all the objects, properties, functions, and program semantics described in this specification. #[3] so after a lot of advance negotiation, the various parties got together in Oslo in July 2008 and agreed a way forward (Brendan Eich (inventor of JavaScript) later termed that approach "Harmony" when writing it up). Harmony deferred some things, put some things completely off the table forever (namespaces, packages, early binding), and — importantly — allowed the committee to move forward with the first specification update since 1999: The 5th edition. #[4] Of particular interest is the word "harmony" in Eich's e-mail. "Harmony" was the designated name for the new ECMAScript development process, to be adopted from ECMAScript 6 (later renamed 2015) onwards. #[5] Please note that for ECMAScript Edition 4 the Ecma standard number “ECMA-262 Edition 4” was reserved but not used in the Ecma publication process. Therefore “ECMA-262 Edition 4” as an Ecma International publication does not exist. #