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の仕様です。
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 |
| 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まで出てくるんだ?」
という疑問も少し解消します。
HTMLってW3Cじゃなかったの? WHATWGとの違いを整理する
そのHTML、本当に正しい? 検索結果を鵜呑みにしないための調べ方