Skip to content

ECMAScript のバージョン (JavaScript で利用できる機能) について

要約

  • ニコ生ゲームにおいて ES2016 以降の機能は利用しないでください (2024 年 9 月現在)。
  • TypeScript では、target を指定することで ES2016 以降でも利用できる機能があります。

ECMAScript のバージョンと動作環境問題

JavaScript の構文や組み込みの機能は、ECMAScript (ECMA-262) として規格化されています。 規格は毎年更新されていて、新しい版ほど高機能になります。

たとえば const, let やアロー関数、 MapSet などは 2015 年の版 (ES2015) で追加された機能です。 同様に、冪乗演算子 ** は 2016 年の版 (ES2016)、 async 関数は 2017 年、optional chaining 演算子 ?. は 2020 年の版で追加されました。

新しい版の機能は便利なことも多い一方、 実行環境によってはサポートされていない 可能性があります。 サポートされていない機能を利用すると、プログラムは単にエラーになり、続行できません。

特に演算子や構文がサポートされていない場合、プログラムは一行も実行されることなくエラーになるため 「ゲーム画面にエラーメッセージを表示してプレイヤーにソフトウェア更新を促す」といった対応すらできません。

ニコ生ゲームのサポート範囲

この問題を避けるため、 ニコ生ゲームでは現在、ES2015 までの機能をサポート範囲 としています。 2024 年 9 月現在、ES2016 以降の機能の利用は避けるようにしてください。

避けるべき機能の例:

  • **, ?., ??, &&=, ||= などの演算子
  • オブジェクト内の ...
  • 変数束縛なしの catch
  • 配列の flat(), flatMap(), at()
  • 文字列の padStart(), padEnd(), matchAll()
  • BigInt, WeakRef

TIP

これらは一例です。「ES2016 以降」に該当する機能の具体的な内容については、 Ecma TC39 の Finished Proposals などを参照してください。 このページは 2016 年以降の版に含められた仕様の一覧になっているので、書かれているものは全て ES2016 以降に当てはまります。

後述のとおり、この制限は TypeScript では一部緩和されます 。 より新しい機能を使いたい場合は TypeScript テンプレートの利用を検討してください。

INFO

ニコ生ゲームのこの制限は、主にニコニコ生放送がサポートする古い機種のスマートフォンによって生じています。 将来的に Android などのサポート状況が変化した場合、この制限は緩和されます。

TypeScript で開発している場合

TypeScript では、.js ファイルを生成する際の ECMAScript のバージョンを指定することができます (tsconfig.json の "target" プロパティ) 。

Akashic Engine の TypeScript テンプレートには最初からこの設定が含まれています。 そのため構文や演算子に関しては ES2016 以降の機能を利用できます。 たとえば (ES2020 で追加された) ?? 演算子を利用する以下のコードは、

typescript
x ?? false;

ES2015 までの機能だけを使う等価なコードとして以下の内容が .js ファイルに出力されます。

javascript
x !== null && x !== void 0 ? x : 100;

WARNING

この TypeScript による変換は構文や演算子に限られます 。クラスやオブジェクトのメソッドなどには対応していません。 たとえば以下のものは TypeScript テンプレートであっても利用できません。

  • 配列の flat(), flatMap(), at()
  • 文字列の padStart(), padEnd(), trimStart(), trimEnd(), matchAll()
  • BigInt, WeakRef など

TypeScript テンプレートでは、これらの機能を利用するとエラーになるようになっています。