ECMAScriptの基本知識

#はじめに
JavaScript入門シリーズは**JavaScriptを学び始めたての人やJavaScriptを一度学んだことがあるけれどあまり理解できていない人**を対象に、<code>「JavaScriptを深く理解しよう」ということをテーマにして執筆しています。

今回は**「ES5やES6といった用語をよく聞くけれど、よくわかっていない」**という人が意外と多いと思いましたので、そのような方の悩みを解決できるような記事を作成しました。

ぜひ最後までご覧になってください。

#対象読者
- JavaScriptを学び始めた人
- プログラミング始めたての人
- ES5やES6といった用語がわからない人

#本記事の内容
[1. ECMAScriptとバージョン](#1-ECMAScriptとバージョン)
[2. ECMAScript仕様策定プロセス](#2-ECMAScript仕様策定プロセス)
[2. 仕様策定プロセスを知るメリット](#2-仕様策定プロセスを知るメリット)
[3. まとめ](#3-まとめ)
[4. 最後に](#4-最後に)
[5. 参照サイト](#5-参照サイト)


#1. ECMAScriptとバージョン
まずRubyならばRuby2.6やRuby2.7があるようにJavaScriptにも当然<code>バージョン</code>というものが存在します。

ただし、他のプログラミング言語と少し違うのはJavaScriptの場合その言語仕様というのは**ECMAScriptにより定められているため、バージョンの管理はECMAScriptにより行われているという点です。**

（ECMAScriptとJavaScriptの関係性などが曖昧な人は前回の記事[【JavaScript】JavaScript入門（１）](https://qiita.com/yusuke_blog1026/items/d5c81b6c819dd02660de)をご覧ください）

そのため、JavaScriptのバージョンを表す際にはJS5やJS6みたいな言い方はせずに、<code>ES5やES6</code>みたいな言い方をすることになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751055/bd1aac20-6977-8a49-86fb-71d7f92e2b90.png)

<br>
では次にJavaScriptのバージョンの歴史について見ていきましょう。

以下の表のようになっています。

| 年   | バージョン | 通称          | 
| :--: | :--------: | :-----------: | 
| 2009 | ５版       | ES5           | 
| 2015 | ６版       | ES2015（ES6） | 
| 2016 | ７版       | ES2016（ES7） | 
| 2017 | ８版       | ES2017（ES8） | 
| 2018 | ９版       | ES2018（ES9） | 

ES5というのが、ECMAScriptの第５版で2009年に発行されたもの・ES6というのがECMAScriptの第６版で2015年に発行されたもの……というようになっています。

ここで注目して欲しいのが、**ES5とES6の間に約6年間の間隔が空いているということです。**

ES6を発行するためにこのようにかなり長い期間かかってしまったため、ES5から比べると大規模なアップデートになってしまいました。

そのため、**ES6とES5では使用できる機能などに大きな差が出ています**

なので、JavaScriptを学習している際に**<code>「この機能はES5では使用できないけど、ES6では使用できます」</code>**みたいな説明を頻繁にすることがあり、その結果**ES5やES6という言葉だけが一人歩きしてしまっていたのです。**

      
#2. ECMAScript仕様策定プロセス
もう一度先ほどの表を見てください。

ES6以降は<code>かなり短いスパン(1年ごと)</code>で仕様が変更されていることがわかると思います。

実はES6以降は**ECMAScriptの仕様策定のプロセスにいくつか変更があり、このように短いスパンでリリースできるようになりました。**

次はこの仕様策定のプロセスについて見ていきます。

## Living Standard
まず仕様策定のプロセスについて説明する前に、<code>**現在のECMAScriptの仕様のルール**</code>について見ていきます。

現在、ECMAScriptの仕様を決める際に取られている方法は**Living Standardと呼ばれるもので、これは追加したい機能ごとに仕様を策定し、仕様が決まったものから最新版の仕様書に順次追加していくというものになります。**

先ほどの表を見てもわかる通り、ES5までは全ての仕様の合意が取れるまでずっと議論をし続け、それらが決まってからリリースされていたため、**リリースまでにかなり時間がかかってしまい、結果的に言語の進化を停滞させてしまっていました。**

それにより、<code>日々アップデートされ続けるブラウザ</code>にも対応できなくなってしまい、言語仕様としては非常に不都合なものでした。

そういった背景を受け、Living Standardと呼ばれる仕様策定のルールに変更になりました。

## 仕様策定プロセス
では本題の仕様策定のプロセスですが、下のように大きく5つのステージに分かれています。[^1]

[^1]: 仕様策定のプロセスは以下の公式ドキュメントに記載されています。[TC39-仕様策定プロセス](https://tc39.es/process-document/)

| 段階    | 通称      | 概要             | 
| :-----: | :-------: | :--------------: | 
| Stage 0 | Strawman  | アイデアレベル   | 
| Stage 1 | Proposal  | 機能提案・検討   | 
| Stage 2 | Draft     | 機能の仕様書ドラフトを作成した段階 | 
| Stage 3 | Candidate | テスト・実装     | 
| Stage 4 | Finished  | 仕様決定。正式にECMAScriptにマージできる         | 


まず仕様に追加する機能はそれぞれ個別の<code>ECMAScript proposals（提案書）</code> として進められていきます。

この現在策定中のproposalsに関しては、GitHub上の[tc39/proposals](https://github.com/tc39/proposals)でも公開されていて、各々のproposalは<code>**Stage0~4までの5段階**</code>に分かれています。

（各proposal毎にStageを進めるかどうかというのは**2ヶ月毎に行われるTC39[^2]のミーティングで決定されています。**）

[^2]: [TC39](https://tc39.es/)というのはECMAScriptの仕様策定を行っているECMA Internationalという団体の技術委員会のことです。この技術委員会が中心になってECMAScriptの仕様が決められていきます。

実際の流れとしましては、**Stage2以降のものから最新のES版の仕様書に順次取り込まれていき、Stage4になった段階でドラフト版の[tc39/echma262](https://github.com/tc39/ecma262)へマージされ、そのマージされた情報を元に<code>ES20××</code>としてリリースするという流れになっています。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751055/649c5f6b-9efa-9f3c-ad51-2f30f06b9a01.png)



#3. 仕様策定プロセスを知るメリット
ここまで記事を読まれた方の中には

**「仕様策定のプロセスについてはわかったが、この知識はいったい何の役立つのか？」**

と思われている方もいらっしゃるかもしれません。

大丈夫です。安心してください。

**「仕様策定のプロセスを知っている」ということは、実はJavaScriptを学習していく上で非常に強力な武器になります**

それは<code>**常に言語の最新の状態について知ることができるというメリットにあります**</code>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751055/b32656e3-6029-121c-7585-ff3f542a42fd.png" width=30%>




今は便利な時代になり、誰でも情報を発信できるようになったため、**世の中には正しい情報もそうでない情報を溢れかえっています。**

そんな中で<code>公式のドキュメントや仕様書のような1次情報</code>は、その内容の正確さが唯一保証されているものであり、**そういった情報にキャッチアップできるというのはプログラミング言語を学んでいく上では非常に大切になってきています。**



>例えば、何かしらの機能を実装したいと思った時、公式の仕様書を確認すると<code>**どうやらStage２である**</code>と書いてありました。

>すると、<code>**「まだテストがされていない不完全な状態であるため使用するのは控えよう」**</code>と外部リソースに頼ることなく自分自身で判断できるようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751055/9db6949d-ef30-d3d3-b32c-b65a2634c5d7.png" width=50%>

このように仕様策定のプロセスを知ることは、<code>**「自分自身で正しい情報を取得し、判断できるスキル」**</code>につながってくるので、実は非常に大切なのです。


#4. まとめ

- ES5とES6の間で6年間分のアップデートが行われたため、<code>**両者の間では使用できる機能に大きな差がある**</code>
- 現在のECMAScriptの仕様策定の方法としては<code>**Living Standard**</code>が取られている
- 仕様策定のプロセスは大きく5つのプロセスに分かれており、**<code>Stage2以降から順次仕様書に追加されていき、Stage4となった段階でドラフト版へ移行し、特定の時期になったら最新版のECMAScriptとしてまとめて公開する</code>**
- 仕様策定プロセスを知るメリットは<code>**外部リソースに頼らず、自分自身で正しい情報を取得し判断できるようになるという点**</code>

#5. 最後に
本記事の内容がみなさんの参考になれば嬉しいです。

最後までご覧いただきありがとうございました。

#6. 参考文献
[Udemy講座：【JS】初級者から中級者になるためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
[書籍：改訂新版JavaScript本格入門](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88JavaScript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%81%AE%E5%BF%9C%E7%94%A8%E3%81%BE%E3%81%A7-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/477418411X)
[学習サイト：JavaScript Primer](https://jsprimer.net/)