JavaScript モードの切り替えに関する考慮事項
アプリケーションまたはスクリプトで JavaScript モードを切り替えると、既存のスクリプトの動作が変わる場合があります。JavaScript モードを切り替える前、または切り替え後に発生した問題のトラブルシューティングを行う前に、動作変化の例をいくつか確認してください。
JavaScript モードの詳細については、「JavaScript モード」および「JavaScript エンジン機能のサポート」を参照してください。
この表は、JavaScript の動作が、寛容でエラーが発生しやすい ES5 以前の環境から、より厳格で予測可能な ES5、そして最後に ES12 (ECMAScript 2021) のより機能豊富な環境へとどのように進化したかを示しています。
| 機能 | 互換モード | ES5 標準モード | ECMAScript 2021 (ES12) |
|---|---|---|---|
| Arguments オブジェクト | arguments オブジェクトは存在しますが、strict モードがないため、変更は arguments に反映されます。出力: |
strict モードでは、arguments オブジェクトはパラメーターの変更を反映せず、エラーをスローします。出力: |
ES5 と同じです。 |
| ブール値の上書き | プリミティブのブール値 (true、false) を上書きできますが、予期しない動作が発生する可能性があります。 |
プリミティブのブール値はより保護されていますが、変数に代入すると上書きできます。 | ES5 と同じですが、strict モードでは一部の代入を防ぐことができます。条件式は、次の形式で記述する必要があります。 |
| 構文エラーの例外 | 構文エラーは実行時に例外をスローします。エラー処理に一貫性がありません。例: |
特に strict モードでの、より一貫性のある構文エラー処理。例: |
ES5 と同じですが、更新されたエンジンでは、処理がより堅牢になり、エラーメッセージがより明確です。例: |
| インクリメントとデクリメント | 変数に対して許可されますが、複雑な式では予期しない動作になる可能性があります。出力: |
明確さは向上しましたが、変数 (var、let、const) に対して引き続き許可されます。出力: |
ES5 と同じですが、一部のコンテキスト (const など) でより厳格なルールがあります。 |
| 行の継続 | バックスラッシュ (\) で指定できますが、読みやすさの問題のためお勧めしません。この例では、3 つの関数がすべて呼び出されます。 |
互換モードと同じです。行の継続処理に変更はありません。前の例では、ES5 は最初の関数のみを呼び出し、式が終了するまで、改行を含む最初のコメントの後のすべてをコメントとして扱います。 | ES5 と同じですが、テンプレートリテラルが読みやすい代替手段となります。 |
| セミコロンの欠落 | セミコロンの自動挿入 (ASI) により、予期しない動作が発生することがよくありました。 | セミコロンがない場合、構文エラーをスローします。 | ES5 と同じです。更新されたプラクティスでは、明示的なセミコロンが推奨されています。 |
| 存在しない関数 | 存在しない関数が呼び出されると、ReferenceError をスローします。 |
非関数が呼び出された場合、TypeError をスローします。 |
存在しない関数が呼び出されたり、プロパティが参照されたりすると、EcmaError をスローします。 |
| 存在しないプロパティ | 存在しないプロパティがアクセスされると、undefined を返します。スローされるエラーはありません。 |
ES5 以前と同じです。 | 互換モードおよび ES5 標準モードと同じです。 |
| 数値リテラル | 基本的な 10 進数および 16 進数リテラル。 | より厳格な解析ルールが導入され、数値リテラルの処理が改善されました。 | 2 進数 (0b)、8 進数 (0o)、BigInt リテラル (123n) が追加されました。 |
| プロパティとして予約済みのキーワード | 予約済みキーワードを使用することはできません。 | 予約済みキーワードは、obj.for のようにプロパティ名として使用でき、エラーはありません。返されたときにオブジェクトを出力します。 |
ES5 と同じです。 |
| let と yield のキーワード扱い | let と yield はキーワードではなく、識別子としてのみ使用できます。 |
let がキーワードとして導入されています。yield は strict モードで予約されています。 |
どちらもキーワードです。これらを識別子として使用すると、構文エラーがスローされます。 |