JavaScript モードの切り替えに関する考慮事項

  • リリースバージョン: Zurich
  • 更新日 2025年07月31日
  • 所要時間:5分
  • アプリケーションまたはスクリプトで JavaScript モードを切り替えると、既存のスクリプトの動作が変わる場合があります。JavaScript モードを切り替える前、または切り替え後に発生した問題のトラブルシューティングを行う前に、動作変化の例をいくつか確認してください。

    JavaScript モードの詳細については、「JavaScript モード」および「JavaScript エンジン機能のサポート」を参照してください。

    この表は、JavaScript の動作が、寛容でエラーが発生しやすい ES5 以前の環境から、より厳格で予測可能な ES5、そして最後に ES12 (ECMAScript 2021) のより機能豊富な環境へとどのように進化したかを示しています。

    表 : 1. JavaScript モードでの動作の違い
    機能 互換モード ES5 標準モード ECMAScript 2021 (ES12)
    Arguments オブジェクト arguments オブジェクトは存在しますが、strict モードがないため、変更は arguments に反映されます。出力:
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: [object Arguments]
    *** Script: 123
    strict モードでは、arguments オブジェクトはパラメーターの変更を反映せず、エラーをスローします。出力:
    sn_es5: 123
    sn_es5: undefined
    sn_es5: [object Arguments]
    sn_es5: 123
    ES5 と同じです。
    ブール値の上書き プリミティブのブール値 (truefalse) を上書きできますが、予期しない動作が発生する可能性があります。 プリミティブのブール値はより保護されていますが、変数に代入すると上書きできます。 ES5 と同じですが、strict モードでは一部の代入を防ぐことができます。条件式は、次の形式で記述する必要があります。
    (cond_expr instanceof Boolean ? cond_expr.valueOf() : cond_expr).
    構文エラーの例外 構文エラーは実行時に例外をスローします。エラー処理に一貫性がありません。例:
    Javascript compiler exception: unterminated string literal (null.null.script; line 1) in:
    var b = '
    特に strict モードでの、より一貫性のある構文エラー処理。例:
    Evaluator: com.glide.script.RhinoEcmaError: unterminated string literal
       script : Line(1) column(9)
    ==>   1: var b = '
    ES5 と同じですが、更新されたエンジンでは、処理がより堅牢になり、エラーメッセージがより明確です。例:
    SyntaxError: Unterminated string constant at line 1
    
    ==>   1: var b = '
    インクリメントとデクリメント 変数に対して許可されますが、複雑な式では予期しない動作になる可能性があります。出力:
    *** Script: c: 1
    *** Script: gr.related_incidents: 1
    *** Script: 2
    *** Script: 3
    明確さは向上しましたが、変数 (varletconst) に対して引き続き許可されます。出力:
    sn_es5: c: 0
    sn_es5: gr.related_incidents: 1
    sn_es5: 1
    sn_es5: 2
    ES5 と同じですが、一部のコンテキスト (const など) でより厳格なルールがあります。
    行の継続 バックスラッシュ (\) で指定できますが、読みやすさの問題のためお勧めしません。この例では、3 つの関数がすべて呼び出されます。
    var expr = doFoo();  // do foo
               doBar();  // do bar 
               finish();   // all done
     eval(expr);
    
    互換モードと同じです。行の継続処理に変更はありません。前の例では、ES5 は最初の関数のみを呼び出し、式が終了するまで、改行を含む最初のコメントの後のすべてをコメントとして扱います。 ES5 と同じですが、テンプレートリテラルが読みやすい代替手段となります。
    セミコロンの欠落 セミコロンの自動挿入 (ASI) により、予期しない動作が発生することがよくありました。 セミコロンがない場合、構文エラーをスローします。 ES5 と同じです。更新されたプラクティスでは、明示的なセミコロンが推奨されています。
    存在しない関数 存在しない関数が呼び出されると、ReferenceError をスローします。 非関数が呼び出された場合、TypeError をスローします。 存在しない関数が呼び出されたり、プロパティが参照されたりすると、EcmaError をスローします。
    存在しないプロパティ 存在しないプロパティがアクセスされると、undefined を返します。スローされるエラーはありません。 ES5 以前と同じです。 互換モードおよび ES5 標準モードと同じです。
    数値リテラル 基本的な 10 進数および 16 進数リテラル。 より厳格な解析ルールが導入され、数値リテラルの処理が改善されました。 2 進数 (0b)、8 進数 (0o)、BigInt リテラル (123n) が追加されました。
    プロパティとして予約済みのキーワード 予約済みキーワードを使用することはできません。 予約済みキーワードは、obj.for のようにプロパティ名として使用でき、エラーはありません。返されたときにオブジェクトを出力します。 ES5 と同じです。
    let と yield のキーワード扱い letyield はキーワードではなく、識別子としてのみ使用できます。 let がキーワードとして導入されています。yield は strict モードで予約されています。 どちらもキーワードです。これらを識別子として使用すると、構文エラーがスローされます。