JavaScriptについて調べていると、たまに知らない名前が出てきます。

ECMAScript

そして、

TC39

です。

普段は普通に、

const name = "Taro";

console.log(name);

とJavaScriptを書いています。

なのに仕様を調べると、

ECMAScript

と書いてある。

さらに新しいJavaScriptの機能を調べると、

TC39

という名前まで出てくる。

最初は、

「JavaScriptの正式名称がECMAScriptなの?」

「JavaScriptとECMAScriptは別の言語?」

「TC39って何をしているところ?」

となりました。

結論からいうと、

JavaScriptという言語の標準仕様がECMAScriptで、その仕様を策定・更新している技術委員会がTC39

です。

かなり大ざっぱにすると、

JavaScript
    ↓
標準仕様
    ↓
ECMAScript
    ↓
仕様を策定
    ↓
TC39

という関係です。

JavaScriptとECMAScriptは別物?

まず一番気になるところです。

JavaScriptとECMAScriptは別のプログラミング言語なのか?

基本的には、そう考えなくて大丈夫です。

MDNでも、JavaScriptの中核となる言語はECMAScriptという名称で標準化されていると説明されています。

普段プログラムを書くときは、

JavaScript

と呼びます。

一方、

その言語がどう動くべきかを正式に定義した標準

を指すときに、

ECMAScript

という名前が出てきます。

例えば、

const numbers = [1, 2, 3];

const result = numbers.map(value => value * 2);

この、

  • const

  • 配列

  • アロー関数

  • Array.prototype.map()

などの言語機能はECMAScript仕様で定義されています。

つまり普段使っているJavaScriptの中核部分です。


ECMAScriptの仕様書がECMA-262

さらに知らない名前が出てきます。

ECMA-262

です。

ECMAScriptの正式な言語仕様は、

ECMA-262

という規格として公開されています。

2026年9月現在、正式に公開されている年次版は、

ECMAScript 2026 / ECMA-262 第17版

です。

公式はこちら。

ECMA-262 - Ecma InternationalECMAScript® 2026 language specification, 17th edition - ECMAScript is a programming language based on several technologies like JavaScript.リンク先を開く

そして、常に最新の仕様を確認したい場合はこちらです。

ECMAScript Language Specification — TC39

Ecma International自身も、最新のドラフトはTC39のtc39.es/ecma262/で公開されていると案内しています。


じゃあTC39って何?

ECMAScriptの仕様を実際に策定・更新しているのが、

TC39

です。

TC39は、

Technical Committee 39

の略です。

Ecma Internationalの技術委員会の一つで、ECMAScriptの標準化を担当しています。

公式はこちら。

TC39 - Ecma Internationalリンク先を開く

TC39が扱っているのは、

  • JavaScriptの構文

  • データ型

  • 演算子

  • オブジェクト

  • 標準ライブラリ

  • 新しい言語機能

  • 既存仕様の修正

などです。

例えば、

async function loadData() {
    // awaitでPromiseの完了を待つ
    const response = await fetch("/api/data");
}

で使っている、

async
await

のような言語機能もECMAScriptに追加されてきたものです。


JavaScriptの新機能は突然追加されるわけではない

JavaScriptを調べていると、

Stage 2

Stage 3

Stage 4

といった言葉を見ることがあります。

これもTC39です。

JavaScriptに新しい機能を追加するとき、

誰かが思いつく
    ↓
次のJavaScriptに入れよう

と即決されるわけではありません。

新しい機能は提案として検討され、段階的に仕様へ近づいていきます。

大ざっぱには、

Stage 0
アイデア段階

   ↓

Stage 1
正式な提案として検討

   ↓

Stage 2
仕様の形がかなり見えてくる

   ↓

Stage 2.7

   ↓

Stage 3
仕様としてかなり完成に近い

   ↓

Stage 4
完成
ECMAScript仕様へ

という流れです。

なお、現在のTC39プロセスではStage 2.7も存在するため、昔の記事にある「Stage 0〜4の5段階」という説明だけを見ると現在のプロセスとは少し違います。

こういうところも、

古い技術記事だけを見ていると情報がずれる

例の一つです。


ECMAScriptは毎年更新される

昔は、

ES3
ES5
ES6

という呼び方をよく見ました。

特に、

ES6

は今でもかなりよく使われます。

ES6は、

ECMAScript 2015

のことです。

現在は基本的に、

ECMAScript 2024
ECMAScript 2025
ECMAScript 2026

のように年ごとに仕様が公開されています。MDNも、ECMAScriptの各版は毎年標準として承認・公開されると説明しています。

つまり、

ES6
↓
ES7
↓
ES8

という呼び方より、

ES2015
ES2016
ES2017
...
ES2026

と考えた方が現在は分かりやすいです。


じゃあ普段からECMA-262を読めばいい?

HTMLのときと同じ疑問が出てきます。

正式な仕様書があるなら、それを直接読めばいいのでは?

もちろん、厳密に調べたいならそれが一次資料です。

ただし、ECMA-262を開いてみると分かります。

かなり厳しい。

例えばJavaScriptで、

const result = [1, 2, 3].map(value => value * 2);

と書きたいだけなのに、

ECMA-262では、

  • 抽象操作

  • 内部スロット

  • 実行コンテキスト

  • Completion Record

  • Realm

  • ECMAScript Language Value

など、普段コードを書くだけなら意識しない概念まで厳密に定義されています。

これは当然です。

ECMA-262は、

JavaScriptの入門書ではなく、JavaScriptを正確に実装するための仕様書

だからです。

MDN自身も、ECMAScript仕様書は実装に必要な要件を示すもので、普通にJavaScriptを書く場合にはJavaScript向けドキュメントを使うよう説明しています。

なのでHTMLと同じく、

普段の開発
   ↓
  MDN

もっと厳密に確認
   ↓
ECMA-262

でよさそうです。

JavaScriptのMDNはこちら。

JavaScript | MDNJavaScript (JS) は軽量でインタープリター型(あるいは実行時コンパイルされる)第一級関数を備えたプログラミング言語です。ウェブページでよく使用されるスクリプト言語として知られ、多くのブラウザー以外の環境、例えば Node.js や Apache CouchDB や Adobe Acrobat などでも使用リンク先を開く

ところが、ここでもう一つ罠がある

普段ブラウザでJavaScriptを書いていると、

document.querySelector("#button");

fetch("/api/users");

localStorage.setItem("name", "Taro");

setTimeout(() => {
    console.log("Hello");
}, 1000);

みたいなコードを普通に書きます。

全部JavaScriptに見えます。

でも、

これらすべてがECMAScriptで定義されているわけではありません。

ここが少しややこしい。

例えば、

const list = [1, 2, 3];

list.map(value => value * 2);

JSON.stringify(list);

Math.random();

このあたりはECMAScriptです。

一方、

document.querySelector();

fetch();

localStorage.setItem();

などは、ブラウザなどの実行環境が提供している、

Web API

です。

MDNもブラウザ上で「JavaScript」とまとめて呼ばれているものには、

JavaScriptのコア言語
    ↓
ECMAScript

+

DOMなど
    ↓
Web API

という異なる要素が含まれていると説明しています。


fetch()はJavaScriptじゃないの?

これは最初かなり違和感があります。

普通に、

const response = await fetch("/api/users");

とJavaScriptファイルに書いているので、

当然JavaScriptの機能だろう

と思います。

でも厳密には、

await

はECMAScript。

fetch()

はWeb APIです。

つまり、

const response = await fetch("/api/users");

という一行の中でも、

await
↓
ECMAScript

fetch()
↓
Web API

と仕様の出どころが違います。

普段プログラムを書くうえで毎回意識する必要はありません。

ただ、

仕様を調べるときにはかなり重要です。

fetch()をECMA-262で探しても、期待しているFetch APIの仕様は出てきません。

FetchはWHATWGの仕様です。

WHATWG Fetch Standard


documentもECMAScriptではない

同じように、

const button = document.querySelector("#button");

の、

document

もECMAScriptそのものではありません。

DOMなど、Webブラウザが提供する仕組みです。

つまりブラウザでJavaScriptを書く場合、

ECMAScript
JavaScript言語そのもの

        +

Web API
DOM
Fetch
Storage
など

        ↓

普段「JavaScript」と呼んで使っているもの

という構造になっています。

これを知っておくと、

なぜNode.jsではブラウザと同じJavaScriptコードがそのまま動かないことがあるのか

も分かりやすくなります。

JavaScriptという言語は同じでも、

実行環境が提供するAPIが違う

からです。


結局、JavaScriptで困ったらどこを見る?

HTML編と同じように整理すると、こんな感じです。

調べたいこと

見るところ

JavaScriptの使い方

MDN

ArrayPromiseなど

MDN

JavaScript言語の厳密な仕様

TC39 / ECMA-262

JavaScriptの新機能・提案

TC39

DOM

MDN → WHATWG

Fetch API

MDN → WHATWG

ブラウザAPI

MDN → 各仕様

普段なら、

まずMDN
   ↓
もっと詳しく知りたい
   ↓
元の仕様を見る

で十分です。

ただし、

「その機能がECMAScriptなのか、Web APIなのか」

によって、行き着く仕様書が変わります。


まとめ

今回出てきた名前を整理すると、

JavaScript
    ↓
中核となる言語仕様
    ↓
ECMAScript
    ↓
規格番号
    ↓
ECMA-262
    ↑
策定・更新
    ↑
TC39

です。

そしてブラウザでは、

ECMAScript
     +
Web API
     ↓
普段使っている
ブラウザ上のJavaScript

になります。

なので、

JavaScript = ECMAScript

という説明は大筋では合っています。

ただし、

JavaScriptで使っている機能が全部ECMAScriptに書かれている

わけではありません。

Array.map()を深掘りするならECMAScript。

fetch()ならWHATWG。

普段の使い方なら、どちらもまずMDN。

ここまで分かると、

「なんでJavaScriptを調べていたのにWHATWGまで出てくるんだ?」

という疑問も少し解消します。