はじめに
こんにちは。
今回は、JavaScriptの新機能がどのように議論されているのか気になったので、TC39のプロポーザルについて調べてみました。
TC39やプロポーザルの概要についてまとめつつ、実際に現在議論されているプロポーザルを1つ読んでみたいと思います。
TC39とは
TC39は、ECMAScript(JavaScriptの言語仕様のもとになっている標準)の仕様を議論・策定している委員会です。
TCはTechnical Committeeの略で、他にもC#を扱うTC49やDartを扱うTC52などがあります。
JavaScriptにある機能の多くは、ECMAScriptの仕様として定義されています。
JavaScriptの新機能はまずTC39のプロポーザルとして提案され、議論やレビュー、実装からのフィードバックを受けながら段階的に進みます。
近年のECMAScriptは毎年新しい仕様がリリースされますが、段階を踏んでStage 4(後述)まで進んだプロポーザルは、次のECMAScriptの仕様に取り込まれる準備ができた状態になります。
プロポーザルにはStageがある
TC39のプロポーザルには、段階を表すStageというものがあります。それぞれのStageに条件があり、TC39で承認されると次のStageに進むことができます。
| Stage | 状態 | 目安になる条件 |
|---|---|---|
| Stage 0 | アイデア段階 | まだTC39で正式に検討されているわけではない。課題や解決案を探っている段階 |
| Stage 1 | 検討を始める段階 | チャンピオン(プロポーザルを主導する担当者)がいて、解決したい課題や大まかな解決方針が説明されている |
| Stage 2 | 仕様のドラフト段階 | 進めたい解決策が選ばれ、APIや構文、仕様テキストの初期案がある |
| Stage 2.7 | 仕様案を検証する段階 | 仕様テキストが完成し、テスト・実装・利用経験からのフィードバックを待っている |
| Stage 3 | 実装からのフィードバックを待つ段階 | 設計はほぼ固まり、実装してもらうことで問題がないか確認する段階 |
| Stage 4 | 完了した段階 | テストや複数の実装がそろい、ECMAScript仕様に入る準備ができている |
現在どのプロポーザルがどのStageにあるかは、tc39/proposalsから確認できます。
実際にプロポーザルを読んでみる
TC39のプロポーザルはGitHubで管理されており、1つのプロポーザルにつき1つのリポジトリが存在しています。
各プロポーザルのREADMEには、そのプロポーザルの背景や解決したいこと、コードの具体例などが記載されています。
またIssueでは、プロポーザルに関する議論の記録を確認できます。
今回は、Math.clamp を題材として読んでみます。
Math.clampは、値を下限と上限の間に収めるための関数を追加するプロポーザルで、2026年6月時点ではStage 2にあります。
この記事内で紹介するコード例は、tc39/proposal-math-clamp のREADMEに掲載されているものを引用しています。
Math.clampはどんなプロポーザルか
clamp は、値を下限と上限の間に収める処理です。
Math.clamp(5, 0, 10); // 5
Math.clamp(-5, 0, 10); // 0
Math.clamp(15, 0, 10); // 10
この例では、0 から 10 の範囲に値を収めています。
-
5は範囲内なのでそのまま -
-5は下限の0より小さいので0を返す -
15は上限の10より大きいので10を返す
また、現在のJavaScriptで同じような関数を書く例として以下の2つが紹介されています。
function clamp(number, minimum, maximum) {
if (number < minimum) {
return minimum;
}
if (number > maximum) {
return maximum;
}
return number;
}
function clamp(number, minimum, maximum) {
return Math.min(Math.max(number, minimum), maximum);
}
この書き方でも Math.clamp と同じ処理を実現できますが、可読性が低く、そして書き間違いを起こす可能性があります。
こういった処理は特にアニメーションやインタラクティブなコンテンツにおいて用いられることが多く、C#、C++、Rustといった多くの言語で同様の機能が標準で存在しています。
また、lodashやthree.jsなどのライブラリにも同様の機能が存在しており、有用性や普及度の高さがこのプロポーザルの背景・動機となっているようです。
その他の使い方
下限や上限がないことを表したい場合は、-Infinity や Infinity を使う例も記載されています。
Math.clamp(5, 0, Infinity) === Math.max(5, 0); // 5
Math.clamp(-5, -Infinity, 10) === Math.min(-5, 10); // -5
また、最小値が最大値より大きい場合は、RangeError を投げるようになっています。
Math.clamp(10, 5, 0); // RangeError
まとめ
- TC39はECMAScriptの仕様を議論・策定している委員会で、JavaScriptの新機能はまずTC39のプロポーザルとして提案される
- プロポーザルにはStageがあり、段階を踏んで実際の仕様に取り入れられる
- プロポーザルはGitHubで管理されており、各プロポーザルのリポジトリから概要や論点を知ることができる
プロポーザルは誰でも提案することが可能です。現状のJavaScriptの仕様に対して課題やその解決策を思いついた方は、ぜひこちらを参考に提案してみてください。