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

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

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

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

    表 : 1. JavaScript モードでの動作の違い
    機能 互換モード ES5 標準モード ECMAScript 2021 (ES12)
    Arguments オブジェクト arguments オブジェクトは存在しますが、strict モードがないため、変更は引数に反映されます。プリント:
    *** 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 進リテラル。 より厳格な解析ルールが導入され、数値リテラルの処理が改善されました。 バイナリ (0b)、8 進数 (0o)、BigInt リテラル (123n) が追加されました。
    プロパティとして予約済みのキーワード 予約済みキーワードを使用することはできません。 予約済みキーワードは、 obj.for のように、エラーなしでプロパティ名として使用できます。返されたときにオブジェクトを出力します。 ES5 と同じです。
    let と yield をキーワードとして扱う letyield はキーワードではなく、識別子としてのみ使用できます。 let がキーワードとして導入されています。 yield は strict モードで予約されています。 どちらもキーワードです。これらを識別子として使用すると、構文エラーがスローされます。