JavaScriptについて調べたり技術記事を読んだりしていると、「ECMAScript(エクマスクリプト)」や「ES6」「ES2015」「ES2026」といった表記を頻繁に目にします。
「JavaScriptの別名なの?」「なぜES6とES2015のように2種類の呼び方があるの?」「自分の開発現場ではどのバージョンを意識すればいいのだろう?」と疑問に感じたことがある方も多いのではないでしょうか。
本記事では、ECMAScriptとJavaScriptの明確な違いや誕生の歴史、新機能が決まる「TC39」の策定プロセス、そしてモダン開発の基礎となったES6(ES2015)から近年のES2025・ES2026までの注目機能と実務での活かし方を、図解とコード例を交えて分かりやすく解説します。
ECMAScriptとは?一言でいうと「JavaScriptの標準規格(設計図)」
ECMAScript(エクマスクリプト)とは、国際的な標準化団体である Ecma International(エクマ・インターナショナル) が「ECMA-262」という規格番号で策定している、プログラミング言語の標準仕様(設計図)のことです。
一言で整理すると、「ECMAScript = 言語の共通ルールを書いた設計図」であり、「JavaScript = その設計図にもとづいて実際に動くよう作られたプログラミング言語」という関係になります。

なぜ標準規格(ECMAScript)が必要になったのか?
JavaScriptは1995年、当時の主要ブラウザ「Netscape Navigator」を開発していたNetscape社のブレンダン・アイク(Brendan Eich)氏によって生み出されました(発表当初はLiveScriptと呼ばれ、直後にJavaScriptへ改称)。
ところが翌1996年、Microsoft社がInternet Explorer向けに「JScript」という独自の互換言語を搭載したことで、「ブラウザごとに動くコードと動かないコードが異なる」という深刻な互換性トラブルが発生しました。当時はWebサイト上に「このページはNetscapeでご覧ください」といった注意書きが並ぶほど混乱していたのです。
この事態を解決するため、特定の企業に偏らない中立な標準化団体「Ecma International」に仕様が持ち込まれ、1997年6月に共通規格の第1版(ECMA-262)が公開されました。当時「Java」という名称の商標権をSun Microsystems社(現Oracle社)が持っていたため、団体名をとって「ECMAScript」と名付けられたのが始まりです。
ECMAScriptが定める範囲と、ブラウザ独自機能(Web API)の違い
私たちが普段「JavaScriptの機能」として使っているものは、厳密には次の2つが組み合わさってできています。
- ECMAScriptが定めている部分(コア言語仕様):変数宣言(
let/const)、条件分岐、ループ、関数、クラス、非同期構文(Promise/async/await)、組み込みオブジェクト(Array、Object、Map、Set、JSON、Mathなど)。 - 実行環境(ホスト環境)が提供するAPI:たとえばWebブラウザ上の
document.querySelector()(DOM操作)、window、fetch()、localStorageなどはECMAScriptではなく、W3CやWHATWGが策定する「Web API」です。同様にNode.jsのファイル操作(fs)もNode.js固有のAPIです。
つまり、ECMAScriptは「特定の画面やOSに依存しない、純粋な言語としての文法・データ処理ルール」を定義しています。だからこそ、ブラウザだけでなくサーバーや業務自動化ツールなど幅広い場所で同じ文法が使えるのです。
TypeScript・Node.js・Google Apps Script(GAS)との関係
ECMAScriptの知識は、フロントエンドのJavaScript開発以外にもそのまま活かすことができます。
- JavaScriptエンジン(V8 / SpiderMonkey / JavaScriptCore):Chromeの「V8」、Firefoxの「SpiderMonkey」、Safariの「JavaScriptCore」は、それぞれECMAScriptの仕様書を忠実に読み取って高速に実行するプログラムです。
- TypeScript:ECMAScriptの構文をベースに「静的型付け」の仕組みを上乗せした言語(スーパーセット)です。ECMAScriptに新しい標準機能が入ると、TypeScriptもそれに追従してサポートします。
- Google Apps Script(GAS):スプレッドシートやGmailを自動化するGASも、実行基盤にChromeと同じ「V8ランタイム」を採用しているため、アロー関数や
const/let、分割代入といったモダンなECMAScript構文を使って効率よく記述できます。
ECMAScriptのバージョン表記(「ES6」と「ES2015」が同じ理由)
ECMAScriptを学ぶときに多くの方がつまずくのが、「ES5」「ES6」といった数字と、「ES2015」「ES2025」「ES2026」といった西暦年の2種類の呼び方が混在している点です。これには、2015年に起きた歴史的なリリース方針の転換が関係しています。

歴史的な転換点となった「ES6(=ES2015)」
初期のECMAScriptは、第1版(ES1:1997年)から第3版(ES3:1999年)まで順調に改訂されましたが、続く第4版(ES4)で野心的な変更を詰め込みすぎた結果、各社の意見が対立して策定が白紙になるという苦い経験をしました。その後、現実的な改善をまとめた第5版(ES5)が2009年に公開されます。
そこからさらに約6年もの歳月をかけて、2015年6月に登場したのが第6版(ES6)です。let / const、アロー関数、クラス、モジュール、Promise など、現代のJavaScriptの骨格となる機能がここで一気に追加されました。
しかし、「6年に1度まとめて巨大アップデートを出す方式」では、仕様の策定もブラウザ側の対応も追いつかず、新しい機能が開発者に届くまで時間がかかりすぎてしまいます。そこで第6版からは方針を改め、「毎年6月に、その時点で完成している機能だけを定期便のようにリリースする方式(年次リリース)」へと切り替わりました。
版数(エディション)と西暦年表記の対応ルール
年次リリース化に伴い、第6版からは公式名称に発行年を付けて「ECMAScript 2015(略称:ES2015)」と呼ぶようになりました。そのため、版数と西暦の関係は以下のようになります(版数に「2009」を足すと西暦年になります)。
- 第5版(2009年):ES5(西暦表記が導入される前の世代)
- 第6版(2015年):ES2015(慣習的に「ES6」ともよく呼ばれます。意味は同じです)
- 第7版(2016年):ES2016(ES7)
- 第16版(2025年):ES2025
- 第17版(2026年):ES2026
なお、開発現場で「ES6以降の書き方で統一しよう」「モダンJavaScriptで書こう」という場合は、2015年単独の仕様だけでなく「ES2015(ES6)以降の新しい構文全般」を指して使われることも多くあります。
新機能が決まる仕組み:TC39と「Stage 0〜4」の策定プロセス
毎年6月に新しいECMAScriptが公開される裏側では、TC39(Technical Committee 39:第39技術委員会)という専門委員会が仕様の審査と策定を担っています。
TC39には、Google(Chrome)・Apple(Safari)・Mozilla(Firefox)・Microsoftなどのブラウザ・ランタイム開発企業や、Metaをはじめとする大規模Web企業、大学の研究者やオープンソース開発者が参加しており、全会一致に近い合意形成(コンセンサス)を重視して議論が進められます。すべての提案(プロポーザル)はGitHub上で公開されており、以下の5段階のステージを順番にクリアしたものだけが正式な規格になります。

| ステージ | 位置づけ | 具体的な審査内容と実務上の目安 |
|---|---|---|
| Stage 0 (Strawperson) |
自由なアイデア | TC39メンバーが「こんな機能があると便利ではないか」と議題に上げた初期アイデア段階。 |
| Stage 1 (Proposal) |
正式な検討提案 | 推進役(チャンピオン)が決まり、解決したい課題や大まかな解決策を委員会として検討開始する段階。形が大きく変わることがある。 |
| Stage 2 (Draft) |
仕様書の下書き | ECMA-262の正式な記述形式で構文や動作の初版ドラフトを作成する段階(近年は仕様確定と実装準備の間にStage 2.7も設けられている)。 |
| Stage 3 (Candidate) |
採用候補・実装検証 | 仕様テキストが固まり、ChromeやFirefoxなどのブラウザエンジンやTypeScriptが先行実装して実環境からのフィードバックを集める段階。 |
| Stage 4 (Finished) |
策定完了・正式収録 | 公式テストスイート(Test262)が整備され、2つ以上の独立したエンジンでの実装・動作検証をクリアした完成状態。次回6月のECMAScriptに収録される。 |
実務エンジニアが新機能を追いかけるときのポイント
SNSや技術ニュースで「JavaScriptにこんな新構文が提案された!」と話題になっていても、まだ Stage 1〜2 の段階では文法が後から変更されたり見送りになったりする可能性があります。実際のプロジェクトで導入を検討するのは、仕様がほぼ確定してブラウザやTypeScriptでの実装が進む 「Stage 3 の後半〜Stage 4」 に到達してからにするのが安全な判断基準です。
バージョン別!ECMAScriptの主要な機能とコード例
ここからは、これまでのECMAScriptの歴史の中で「どのバージョンで、どんな便利機能が使えるようになったのか」を、実務でよく使う代表的な構文を中心に見ていきましょう。
ES5(2009年):配列操作メソッドとJSON・Strictモードの確立
ES6が登場する前の土台を築いたのが2009年のES5です。現在でも毎日使われている基本的なデータ処理機能がこの世代で標準化されました。
- Strictモード(
'use strict'):宣言なしの変数代入などの曖昧でバグを生みやすい書き方をエラーとして検知する厳格モード。 - JSONの標準サポート:
JSON.parse()やJSON.stringify()が言語標準として組み込まれ、Web API通信のデータ扱いが劇的に簡単になりました。 - 配列の高階関数メソッド:
forEach、map、filter、reduce、every、some、Array.isArray()が追加されました。
ES6 / ES2015(2015年):モダンJavaScriptを決定づけた大改革
JavaScriptの書き方を根本から一新したのがES6(ES2015)です。これからJavaScriptやGASを学ぶ方が最初に身につける基本構文の多くが、このES6で導入されました。
letとconstによる変数宣言:従来のvarが抱えていた意図しない変数の上書きを防ぎ、{ }単位のブロックスコープで安全に変数を管理できるようになりました(詳しくは「スコープ」の基本と種類の記事もあわせてご覧ください)。- アロー関数(
() => {}):無名関数を短く書けるだけでなく、thisの参照先が定義時の外側のスコープに固定されるため、コールバック処理でのバグが激減しました(書き方の基本はアロー関数の使い方で解説しています)。 - テンプレートリテラル:バッククォート(
`)を使い、`こんにちは、${name}さん`のように文字列の中へ変数をすっきり埋め込めるようになりました(実例はテンプレートリテラルで変数や式を埋め込む方法をご参照ください)。 - 分割代入とスプレッド構文(
...):オブジェクトや配列から必要な値だけを取り出したり、複製・結合したりする記述がシンプルになりました。 class構文・Promise・ES Modules(import/export):大規模なアプリケーションをファイル分割して整理し、非同期処理を連鎖的に扱うための標準基盤が整いました。
// 【ES5以前】var・文字列連結・functionによる記述
var user = { name: '佐藤', role: 'エンジニア' };
var greetOld = function(u) {
return u.name + 'さん(職種:' + u.role + ')';
};
// 【ES6 / ES2015以降】const・分割代入・アロー関数・テンプレートリテラル
const userModern = { name: '佐藤', role: 'エンジニア' };
const greetModern = ({ name, role }) => `${name}さん(職種:${role})`;
console.log(greetModern(userModern));
// 出力: 佐藤さん(職種:エンジニア)
ES2016〜ES2024:非同期処理と安全なデータ操作の進化
年次リリースに移行してからは、毎年着実に「現場のコードを読みやすく、バグを起こしにくくする機能」が追加され続けています。特に実務への影響が大きかった代表機能は以下のとおりです。
- ES2016:配列に値が含まれるか直感的に調べられる
Array.prototype.includes()の追加。 - ES2017:非同期通信(Promise)を上から下へ同期処理のように読みやすく書ける
async / awaitが登場。さらにObject.values()/Object.entries()も追加。 - ES2018〜ES2019:オブジェクトのスプレッド構文(
{ ...obj })、Promise.prototype.finally()、ネストした配列を平坦化するflat()/flatMap()。 - ES2020:深い階層のデータが
nullやundefinedでもエラーで止まらず安全に参照できるオプショナルチェイニング(?.)と、null/undefinedのときだけ初期値を補うNull合体演算子(??)。 - ES2021〜ES2022:文字列を一括置換する
replaceAll()、クラスの真のプライベートフィールド(#count)、配列の末尾要素をarr.at(-1)で取得できるat()メソッド、Object.hasOwn()。 - ES2023〜ES2024:元の配列を書き換えずに新しい配列を返す非破壊メソッド(
toSorted()、toReversed()、toSpliced())や、配列データをキーごとに集計・分類できるObject.groupBy()。
// オプショナルチェイニング(?.)と Null合体演算子(??)[ES2020]
const response = { profile: { nickname: '' } };
// 空文字 '' や 0 を潰さず、null / undefined のときだけ既定値を使う
const city = response.profile?.address?.city ?? '未設定';
console.log(city); // 出力: 未設定
// 元の配列を壊さない toSorted() [ES2023]
const scores = [82, 95, 70];
const sortedScores = scores.toSorted((a, b) => b - a);
console.log(scores); // [82, 95, 70](元の配列はそのまま安全に保たれる)
console.log(sortedScores); // [95, 82, 70]
// 条件ごとに分類する Object.groupBy() [ES2024]
const tasks = [
{ title: '企画書作成', status: 'done' },
{ title: '画面テスト', status: 'todo' },
{ title: '議事録共有', status: 'done' },
];
const grouped = Object.groupBy(tasks, (item) => item.status);
console.log(grouped.done.length); // 出力: 2
ES2025〜ES2026:集合演算や高精度計算など近年の注目機能
さらに2025年6月承認のES2025(第16版)および2026年6月承認のES2026(第17版)では、これまで外部ライブラリや自作関数に頼っていた定番処理が次々と言語標準に取り込まれています。
- Setの集合演算メソッド(ES2025):2つの
Setの共通部分を求めるintersection()、和集合union()、差集合difference()などが標準メソッドだけで直感的に書けるようになりました。 - イテレータヘルパーと
RegExp.escape()・Promise.try()(ES2025):大量データを必要な件数だけ遅延評価で処理できるイテレータ用.map()/.take()や、正規表現の特殊記号を安全にエスケープするRegExp.escape()、JSONファイルをwith { type: 'json' }で読み込むインポート属性などが標準化されました。 Array.fromAsync()とMath.sumPrecise()(ES2026):非同期ストリームなどの非同期イテラブルから配列を一括生成するArray.fromAsync()や、小数の足し算で起きがちな浮動小数点誤差を抑えて正確に合計を算出するMath.sumPrecise()が追加されました。- Mapの
getOrInsert()・バイト配列のBase64変換・Error.isError()(ES2026):Mapにキーがなければ初期値を登録して取得する処理を1行で書けるgetOrInsert()や、Uint8Arrayの標準Base64変換(toBase64()/fromBase64())、確実なエラー判定を行うError.isError()などが揃いました。
// Setの集合演算メソッド [ES2025]
const webTags = new Set(['HTML', 'CSS', 'JavaScript']);
const appTags = new Set(['JavaScript', 'TypeScript', 'GAS']);
// 両方に共通する要素(積集合)を取得
console.log([...webTags.intersection(appTags)]); // ['JavaScript']
// 浮動小数点の誤差を抑えて正確に合計する Math.sumPrecise() [ES2026]
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(Math.sumPrecise([0.1, 0.2])); // 0.3
// キーが未登録なら初期値をセットして返す Map.prototype.getOrInsert() [ES2026]
const counter = new Map();
const current = counter.getOrInsert('pageA', 0);
counter.set('pageA', current + 1);
ブラウザ互換性と実務での向き合い方(トランスパイラとポリフィル)
ECMAScriptには「Don’t break the Web(既存のWebサイトを壊さない=後方互換性を守る)」という大切な設計原則があります。そのため、20年前に書かれた古いJavaScriptコードでも最新のブラウザで問題なく動作します。
一方で、その逆である「今年追加されたばかりの最新ECMAScript構文を、少し古いバージョンのブラウザや端末で動かす場合」には注意が必要です。実務のWeb開発では、古い環境を取りこぼさずに最新の書き方で効率よく開発するため、次の「トランスパイラ」と「ポリフィル」という2つの仕組みを組み合わせて解決しています。

新しい「文法」を変換するトランスパイラ(Babel・TypeScript・SWCなど)
オプショナルチェイニング(?.)やプライベートフィールド(#field)のような「言語の文法(記号や構文)」そのものが未対応のブラウザでは、コードを読み込んだ瞬間に構文エラー(SyntaxError)になってしまいます。
そこで、開発時は最新の読みやすい構文でコードを書き、公開用にビルドする段階で Babel、TypeScriptコンパイラ(tsc)、SWC、esbuild などの「トランスパイラ(ソースコード変換ツール)」を通すことで、幅広いブラウザが理解できる従来のJavaScript構文へと自動変換して配信します。
足りない「機能」を補うポリフィル(Polyfill)と対応状況の調べ方
一方、Object.groupBy() や Set.prototype.intersection()、Array.fromAsync() のような「新しい標準メソッドやオブジェクト」は、文法自体は従来の関数呼び出しと同じなのでトランスパイラだけでは補えません。これらに対しては、core-js などの「ポリフィル(Polyfill=隙間の穴埋め材)」を読み込ませることで、未対応ブラウザ上でも同じ動作をする関数を擬似的に追加して動かします。
対応状況の確認方法:「この機能は変換なしでそのままブラウザで使えるかな?」と迷ったときは、MDN Web Docs の各解説ページ下部にある「ブラウザーの互換性(Browser compatibility)」の表や、Can I use の検索サイトで対象ブラウザ(Chrome・Safari・Edge・FirefoxおよびiOS Safariなど)のサポート状況をひと目で確認できます。現在では主要ブラウザがすべて自動更新されるため、数年前と比べてはるかに早く最新ECMAScriptがそのまま使える環境が整っています。
まとめ:ECMAScriptの主要バージョン早見表
最後に、ECMAScriptの誕生から近年までの代表的なバージョンと主な特徴を一覧表に整理します。
| バージョン表記 | 公開年 | 代表的な追加機能・歴史的ポイント |
|---|---|---|
| ES1 〜 ES3 | 1997〜1999年 | ブラウザ間の互換性を統一するために標準化を開始。正規表現や例外処理(try / catch)など初期の基本仕様を策定。 |
| ES5(第5版) | 2009年 | 'use strict'、JSON サポート、配列操作メソッド(map / filter / forEach など)を標準化。 |
| ES6 / ES2015 | 2015年 | モダン開発への大転換点。let / const、アロー関数、クラス、分割代入、テンプレートリテラル、Promise、ES Modulesを導入。以降、年次更新へ。 |
| ES2016 〜 ES2019 | 2016〜2019年 | 配列の includes()、非同期構文 async / await、Object.entries()、オブジェクトのスプレッド構文、flat() などを追加。 |
| ES2020 〜 ES2024 | 2020〜2024年 | オプショナルチェイニング(?.)、Null合体演算子(??)、プライベートフィールド(#)、非破壊配列操作(toSorted() 等)、Object.groupBy()。 |
| ES2025 〜 ES2026 | 2025〜2026年 | Set の集合演算メソッド、イテレータヘルパー、RegExp.escape()、Array.fromAsync()、Math.sumPrecise()、Map.prototype.getOrInsert() など。 |
本記事のまとめ
- ECMAScriptはEcma Internationalが策定する「言語の設計図(ECMA-262)」であり、JavaScriptはその設計図をベースに実装された言語。
- 2015年の第6版(ES6 = ES2015)をきっかけに年次更新へ移行したため、以降は「ES2016〜ES2026」のように西暦年で呼ばれるようになった。
- 新機能は技術委員会「TC39」でStage 0からStage 4まで段階的に審査・実装テストされたうえで、毎年6月に正式収録される。
- 実務ではまずES6(ES2015)〜ES2020前後のモダン基本構文をしっかり押さえつつ、対象ブラウザに応じてトランスパイラやポリフィルを活用するのが定石。
「ECMAScriptは共通の設計図であり、毎年少しずつ便利な標準機能が増えている」という全体像をつかんでおくと、公式リファレンス(MDN)やTypeScript・GASのドキュメントを読んだときの理解度がぐっと深まります。ぜひ日々のコーディングや新しい構文のキャッチアップに役立ててみてください。
