ECMAScriptは、 Ecma Internationalによって開発されたJavaScriptの標準規格です。2015年以降、毎年6月にメジャーバージョンが公開されています。
ECMAScript 2025は、16番目のバージョンであり、現行バージョンとして2025年6月にリリースされました。
2004 年 6 月、Ecma International は ECMAScript の拡張であるECMAScript for XML (E4X) を定義する ECMA-357 標準を公開しました。Ecma はまた、リソース制約のあるデバイス向けに設計された ECMAScript の「コンパクト プロファイル」である ES-CP または ECMA 327 も定義しましたが、これは 2015 年に撤回されました。[ 15 ]
提案された ECMA-262 の第 4 版 ( ECMAScript 4またはES4 ) は、1999 年に第 3 版が発行されて以来、ECMAScript の初めての大きな更新となるはずでした。仕様 (および参照実装) は、当初 2008 年 10 月までに完成することを目標としていました。[ 16 ]最初のドラフトは 1999 年 2 月に作成されました。[ 17 ]言語の概要は、2007 年 10 月 23 日にワーキング グループによって公開されました。[ 18 ]
2008 年 8 月までに、ECMAScript 第 4 版の提案は、 ECMAScript Harmonyというコードネームのプロジェクトに縮小されました。当時 Harmony で議論されていた機能には、次のものがありました。[ 19 ]
これらの機能の意図は、大規模なプログラミングをより適切にサポートすることと、パフォーマンスを向上させるためにスクリプトの動的な機能をある程度犠牲にすることを可能にすることにあります。たとえば、Adobeが開発しオープンソース化したActionScriptの仮想マシンであるTamarinは、特定の種類のスクリプトに対してジャストインタイムコンパイル(JIT)をサポートしています。
新機能の導入に加えて、ES3 のバグの一部が第 4 版で修正されることが提案されました。 [ 20 ] [ 21 ]これらの修正やその他の修正、およびJSONエンコード/デコードのサポートは、ECMAScript 第 5 版の仕様に組み込まれています。[ 22 ]
ES-CP (Compact Profile) 仕様が完成した後、第 4 版の作業が開始され、Netscape の JavaScript 2 仕様の理論と Microsoft のJScript .NETの実装経験とのバランスを取るために約 18 か月かけてゆっくりと進捗しました。しばらくして、焦点はECMAScript for XML (E4X) 標準に移りました。この更新は論争なしには終わりませんでした。2007 年後半、後にMozilla Foundationの CTO となる Eich とMicrosoftのInternet Explorerのプラットフォーム アーキテクトである Chris Wilson の間の議論が、いくつかのブログで公開されました。Wilson は、ECMAScript への提案された変更により、言語の以前のバージョンとの後方互換性が一部失われるため、この更新は「Web を破壊する」ことに相当すると警告し[ 23 ]、変更に反対する利害関係者は「隠されている」と述べました。[ 24 ]アイヒ氏は、ウィルソン氏が「ブログで虚偽を繰り返している」ように見えると述べ、反対意見を抑圧しようとする試みはなかったと否定し、批判者に対し、非互換性の具体的な例を挙げるよう求めた。[ 25 ]彼は、 Microsoft SilverlightとAdobe AIRはそれぞれC#とActionScript 3に依存しており、どちらもECMAScript Edition 3よりも規模が大きく複雑であると指摘した。 [ 26 ]
ECMAScript 4 では厳密な型システムが導入されています。たとえば、関数はadd()次のようになります。[ 27 ]
function add ( a : int , b : int ) : int { return a + b ; }以下のプリミティブ型が定義されました: [ 27 ]
BooleanNullNumberObjectStringbytedecimaldoubleintuintvoid変数には以下の修飾子が付く可能性があります。
static: 変数をクラス変数にするprototype: クラスのプロトタイプオブジェクトに変数を追加し、get/set アクセサを付与します。各クラスには以下の修飾子が付けられました。
dynamic: 実行時にインスタンスにプロパティを追加できるようにするfinal: 他のクラスによって拡張することはできませんinternal: 現在のパッケージ内の参照からのみ表示されますpublic: グローバルな参照から見えるクラスコンストラクタはfunctionキーワード(ではなく)で宣言されconstructor、クラス自体の名前が付けられました。[ 27 ]
class X { private var value : int ;public function X ( i : int ) { value = i ; } }ゲッターメソッドとセッターメソッドも、getおよびsetキーワードで定義されました。[ 27 ]
class X { private var _value : int ;function get value () : int { return _value ; }function set value ( n : int ) : void { _value = n ; } }var x : X = new X (); x . value = 10 ;関数には、以下の修飾子が付与される可能性があります。
static: 関数をインスタンス(つまり静的メソッド)ではなく、クラスの特性にする。final: オーバーライドできない関数を宣言しますoverride:同名および同シグネチャのメソッドをオーバーライドしますnative: 関数を「実装定義」であると宣言するJavaのインターフェースと同様に、インスタンスとそれを利用するコードとの間の契約を定義するインターフェースが導入された。 [ 27 ]
interface Greetings { function hello () : void ; function goodMorning () : void ; }class Greeter implements Greetings { public function hello () : void { print ( "Hello, world!" ); }public function goodMorning () : void { print ( "おはよう、世界!" ); } }var greeter : Greetings = new Greeter (); greeter.hello ( ) ;ECMAScript 4 では、 JavaのパッケージやC++およびC#の名前空間のように機能するパッケージが導入されました。さらに、「名前のないパッケージ」は基本的にグローバル名前空間として機能し、他のすべてのパッケージによって暗黙的にインポートされました (そして によって与えられました)。[ 27 ]package{/* ... */}
package org.wikipedia { public class Article extends WikiObject { // ... } }org.wikipedia.*をインポートします。// org.wikipedia のすべてのシンボルをスコープに追加しますimport org.wiktionary.Language ; // タイプ「org.wiktionary.Language」をスコープに追加しますこの例では、Article完全修飾名は ですorg.wikipedia.Article。最新の ECMAScript はモジュール機能を備えていますが、ECMAScript 4 のパッケージは Java のパッケージと同様に、グローバルな命名規則に近い動作をしていました。
名前空間はパッケージとは別の機能としても存在し、定義名の修飾子として機能した。[ 27 ]
package org . wikipedia . examples { public namespace English ; public namespace French ;public class BilingualGreeter { English function hello () : void { console . log ( "Hello, world!" ); }フランス語の関数hello () : void { console . log ( "Bonjour, le monde!" ); } } }import org.wikipedia.examples.BilingualGreeter ;var greeter : BilingualGreeter = new BilingualGreeter (); use namespace English ; // すべての英語名前空間識別子をスコープに追加しますgreeter.hello (); //英語バージョンを呼び出すgreeter.French :: hello ( ) ; // フランス語バージョンを呼び出すYahoo、Microsoft、Google、その他第4版に反対する企業は、ECMAScript 3のより控えめなアップデート版(仮称ECMAScript 3.1)を設計するために独自の小委員会を結成した。この版は、セキュリティとライブラリのアップデートに重点を置き、互換性を非常に重視するものであった。前述の公開論争の後、ECMAScript 3.1チームとECMAScript 4チームは妥協案に合意した。2つの版は並行して開発され、ECMAScript 3.1が意味論と構文の両面でECMAScript 4の厳密なサブセットであり続けるよう、チーム間で調整が行われることになった。
しかし、各チームの哲学の違いにより、部分集合ルールが繰り返し破られ、ECMAScript 4 反対派が将来 ECMAScript 4 を支持または実装するかどうかは依然として疑わしいままでした。 Ecma Technical Committee 39 内で ECMAScript の将来について意見の相違が生じてから 1 年以上が経過し、2 つのチームは 2008 年 7 月に新たな妥協に達しました。ブレンダン アイヒは、Ecma TC39 がすべての関係者の完全な協力のもと ECMAScript 3.1 (後に ECMAScript、第 5 版に改名) プロジェクトに作業の焦点を当て、ベンダーは 2009 年初頭までに少なくとも 2 つの相互運用可能な実装を目指すと発表しました。 [ 28 ] [ 29 ] 2009 年 4 月、Ecma TC39 は第 5 版の「最終」ドラフトを公開し、相互運用可能な実装のテストは 7 月中旬までに完了する予定であると発表しました。[ 30 ] 2009年12月3日、ECMA-262第5版が発行された。[ 31 ]
追加された機能には、 JSON、String.trim()文字列の周囲の空白を簡単に削除する機能(" example "から"example")、String.charAt()文字列内の指定された位置から単一の文字を返す機能、およびが含まれますArray.isArray()。オブジェクト内の最後の値のペアの後のカンマ(var example = { "property1":"value1", "property2":"value2", })も、構文エラーの原因ではなくなりました。[ 32 ]
第 6 版である ECMAScript 6 ( ES6 ) は、後に ECMAScript 2015 に改名され、2015 年 6 月に完成しました。[ 4 ] [ 33 ]この更新では、クラス宣言 ( )、 のような ES6 モジュールなど、複雑なアプリケーションを作成するための重要な新しい構文が追加されていますが、意味的には ECMAScript 5 の厳格モードと同じ用語で定義されています。その他の新機能には、イテレータとループ、Pythonスタイルのジェネレータ、矢印関数式 ( )、ローカル宣言のキーワード、定数ローカル宣言のキーワード、バイナリ データ、型付き配列、新しいコレクション (マップ、セット、WeakMap)、プロミス、数値と数学の強化、リフレクション、プロキシ (仮想オブジェクトとラッパーのメタプログラミング)、エスケープ文字のない複数行文字列にバッククォート () を使用するテンプレート リテラルなどがあります。[ 34 ] [ 35 ]完全なリストは広範囲にわたります。[ 36 ] [ 37 ]最初の「ECMAScript Harmony」仕様として、「ES6 Harmony」としても知られています。classFoo{...}import*asmoduleNamefrom"...";exportconstFoofor...of()=>{...}letconst`
第 7 版、つまり ECMAScript 2016 は2016 年 6 月に完成しました。[ 5 ]その機能には**、数値のべき乗演算子await、async非同期プログラミングのキーワード (ES2017 の準備として)、およびArray.prototype.includes関数が含まれます。[ 5 ]べき乗演算子は と同等ですMath.powが、Python、F#、Perl、Ruby などの言語に似た、よりシンプルな構文を提供します。/asyncはawait、プロミスをより簡単に使用し、非同期コードを開発する方法として高く評価されました。
第 8 版、つまり ECMAScript 2017 は 2017 年 6 月に完成しました。[ 6 ]その機能にはObject.values、オブジェクトを簡単に操作するための関数、Object.entriesジェネレータとプロミスを使用する/構造、並行処理とアトミック操作のための追加機能が含まれています。また、も含まれています。[ 38 ] [ 6 ]Object.getOwnPropertyDescriptorsasyncawaitString.prototype.padStart()
第9版、つまりECMAScript 2018は、2018年6月に最終決定されました。[ 7 ]新機能には...、オブジェクトリテラルのスプレッド演算子とレストパラメータ()、非同期イテレーション、Promise.prototype.finallyおよび正規表現への追加が含まれます。[ 7 ]
スプレッド演算子を使用すると、以下に示すように、オブジェクトのプロパティを簡単にコピーできます。
let object = { a : 1 , b : 2 }let objectClone = Object.assign ( {}, object ) // ES2018以前let objectClone = {... object } // ES2018構文let otherObject = { c : 3 , ... object } console . log ( otherObject ) // -> {c: 3, a: 1, b: 2}第10版、つまりECMAScript 2019は2019年6月に公開されました。[ 8 ]Array.prototype.flat追加された機能には、、、、、およびArray.prototype.flatMapの変更が含まれますが、これらに限定されません。[ 8 ]Array.sortObject.fromEntries
Array.sortは安定していることが保証されており、同じソートキーを持つ要素は、ソート操作の前後で相対的な順序が変わりません。 はArray.prototype.flat(depth=1)配列を指定された深さまで平坦化します。つまり、指定された深さまでのすべてのサブ配列要素が再帰的に連結されます。
もう一つ注目すべき変更点は、いわゆるキャッチバインディングがオプションになったことである。[ 39 ]
第11版、つまりECMAScript 2020は2020年6月に公開されました。[ 9 ]このバージョンでは、新しい関数に加えて、BigInt任意のサイズの整数のプリミティブ型、null合体演算子、およびglobalThisオブジェクトが導入されています。[ 9 ]
BigIntBigInt は、コンストラクタを使用するか、構文 `n` を使用して作成します10n。ここで、数値リテラルの後に `n` が配置されます。BigInt は `n` を超える整数の表現と操作を可能にしますNumber.MAX_SAFE_INTEGERが、Number は倍精度 64 ビットIEEE 754値で表現されます。 の組み込み関数はMathBigInt と互換性がありません。たとえば、BigInt のべき乗は ` **n` ではなく `n` 演算子を使用して行う必要がありますMath.pow。
ヌル合体演算子 は??、左辺がnullまたはの場合、右辺のオペランドを返しますundefined。これは、以下のようなすべての「偽」値に対して||を返す演算子とは対照的です。"string"
undefined ?? "string" // -> "string" null ?? "string" // -> "string" false ?? "string" // -> false NaN ?? "string" // -> NaNオプショナルチェイニングを使用すると、各レベルで AND チェックを行うことなく、オブジェクトのネストされたプロパティにアクセスできます。例は次のとおりですconst zipcode = person?.address?.zipcode。いずれかのプロパティが存在しない場合、zipcodeはになりますundefined。
第 12 版である ECMAScript 2021 は 2021 年 6 月に公開されました。[ 10 ]このバージョンでは、replaceAll文字列用のメソッドPromise.any、入力値が満たされたときに短絡するプロミス コンビネータAggregateError、複数のエラーを一度に表す新しいエラー型、論理代入演算子 ( ??=、、)、ガベージ コレクションから対象オブジェクトを保持せずに対象オブジェクトを参照するための、対象オブジェクト&&=がガベージ コレクションされるときに実行されるクリーンアップ操作の登録と登録解除を管理する、数値リテラルの区切り文字 ( )、およびがより正確になり、実装定義のソート順になるケースの数が減少しました。||=WeakRefFinalizationRegistry1_000Array.prototype.sort
第 13 版である ECMAScript 2022 は、2022 年 6 月に公開されました。[ 11 ]このバージョンでは、トップレベルの が導入されawait、キーワードをモジュールのトップレベルで使用できるようになりました。新しいクラス要素として、パブリックおよびプライベートのインスタンス フィールド、パブリックおよびプライベートの静的フィールド、プライベートのインスタンス メソッドとアクセサ、プライベートの静的メソッドとアクセサが追加されました。クラス内の静的ブロックにより、クラスごとの評価初期化を実行できます。#x in obj構文により、オブジェクトにプライベート フィールドが存在するかどうかをテストできます。フラグによる正規表現のマッチ インデックス/dにより、マッチした部分文字列の開始インデックスと終了インデックスが提供されます。オブジェクトcauseのプロパティErrorにより、エラーの原因チェーンを記録できます。Strings at、Arrays、および TypedArrays のメソッドにより、相対インデックスが可能になります。またObject.hasOwn、 の便利な代替手段も追加されましたObject.prototype.hasOwnProperty。
第 14 版である ECMAScript 2023 は 2023 年 6 月に発行されました。[ 40 ]このバージョンでは、 および の 、 、 、 、 メソッド、および の メソッドが導入されました。toSortedまたtoReversed、with実行findLast可能findLastIndexなECMAScriptファイルをより容易にするために、ファイルの先頭にshebangコメントのサポートが追加され、弱いコレクションのキーとしてほとんどのシンボルを使用できるようになりました。Array.prototypeTypedArray.prototypetoSplicedArray.prototype#!
第15版であるECMAScript 2024は、2024年6月に発行されました。[ 41 ]このバージョンではObject.groupBy、Map.groupBy静的メソッド、、Promise.withResolversに対するさまざまな集合演算Set.prototype、および/v正規表現用のUnicodeフラグが導入されています。
およびメソッドはObject.groupBy、Map.groupBy指定されたコールバック関数の戻り値を使用して、反復可能なコレクションをグループ化します。
// サンプルデータconst arr = [ { year : "2024" , id : 0 }, { year : "2023" , id : 1 }, { year : "2024" , id : 2 }, ];const obj = Object.groupBy ( arr , ( el ) => el.year ) ; console.log ( obj ) ; // { "2024" : [{ year: "2024", id: 0 }, { year : "2024", id: 2 } ], "2023": [{ year: "2023", id: 1 }] }Promise.withResolversプロミスの解決関数と拒否関数をコンストラクタで割り当てることなく直接取得する簡単な方法を提供します。[ 42 ]
// ES 2023 let resolve ; let reject ; let promise = new Promise (( res , rej ) => { resolve = res ; reject = rej ; });// ES 2024 const { resolve , reject , promise } = Promise . withResolvers ();正規表現のフラグ/vは単にフラグの改良版です/uが、後方互換性のない変更を加えるため、新しいフラグとして導入する必要がありました。[ 43 ]
2025年にリリースされたECMAScriptの第16版。[ 44 ]次の内容が追加されました。
Iteratorイテレータをラップでき、遅延評価Arrayを備えた関数インターフェースを提供するオブジェクト。Promise.try: プロミスである場合もそうでない場合もあるメソッドをプロミスとして呼び出すSet方法: Set.intersection、Set.difference、Set.symmetricDifference、Set.isSubsetOf、Set.isSupersetOf、Set.isDisjointFromRegExp.escape文字列をエスケープして、正規表現パターンと連結できるようにする関数。ES.Next は、執筆時点での次のバージョンを指す動的な名前です。ES.Next の機能には、承認された仕様の一部ではない完了した提案 (別名「ステージ 4 提案」) が含まれます。言語委員会は「生きた仕様」モデルに従っているため、これらの変更は標準の一部であり、承認は形式的なものです。[ 45 ]
{{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク){{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク){{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)