このページはECMAScript® 2020 Language Specification10 ECMAScript Language: Source Code章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

10.1 ソーステキスト(Source Text)

構文

SourceCharacter ::
any Unicode code point

ECMAScriptコードはUnicodeを使用して表現されます。 ECMAScriptのソーステキストは、一連のコードポイントです。 サロゲートコードポイントを含む U+0000 から U+10FFFF までのすべてのUnicodeコードポイント値が、ECMAScript文法で許可されているソーステキストで使用される可能性があります。 ECMAScriptソーステキストのファイル形式や、データのやりとりなどに使用される実際のエンコーディングは、この仕様には関係ありません。 ECMAScriptの準拠実装は、外部ソーステキストのエンコードに関係なく、ソーステキストをSourceCharacter値の同等のシーケンスであるかのように処理します。各SourceCharacterはUnicodeコードポイントです。 ECMAScriptの適合実装は、ソーステキストの正規化を実行したり、ソーステキストの正規化を実行しているかのように動作する必要はありません。

ユーザーがシーケンス全体を単一の文字と見なしても、結合文字シーケンスのコンポーネントは個別のUnicodeコードポイントとして扱われます。

文字列リテラル、正規表現リテラル、テンプレートリテラル、および識別子は、コードポイントの数値を明示的に表すUnicodeエスケープシーケンスを使用して、Unicodeコードポイントを表すこともできます。 コメント内では、そのようなエスケープシーケンスはコメントの一部として事実上無視されます。

ECMAScriptは、Unicodeエスケープシーケンスの動作がJavaプログラミング言語と異なります。たとえば、Javaプログラムでは、Unicodeエスケープシーケンス\u000Aが単一行コメント内にあると、行末記号として解釈されます(UnicodeコードポイントU+000AはLINE FEED(LF))。したがって、次のコードポイントはコメントの一部ではありません。同様に、Unicodeエスケープシーケンス\u000AがJavaプログラムの文字列リテラル内にあると、行終了文字として解釈されます。これは文字列リテラル内では許可されまていません。LINEFEED(LF)が文字列リテラルの文字列値の一部になるようにするには、\u000Aの代わりに\nを記述する必要があります。ECMAScriptプログラムでは、コメント内のUnicodeエスケープシーケンスは解釈されないため、コメントの終了に影響しません。同様に、ECMAScriptプログラムの文字列リテラル内のUnicodeエスケープシーケンスは常にリテラルに影響します。ただし文字列リテラルを終了させる行終端記号またはコードポイントとして解釈されることはありません。

10.1.1 静的セマンティクス(Static Semantics): UTF16Encoding ( cp )

数値コードポイント値cpUTF16Encodingは、次のように決定されます。

  1. Assert: 0cp0x10FFFF
  2. cp0xFFFF なら cp を返す
  3. floor((cp - 0x10000) / 0x400) + 0xD800cu1 とする
  4. ((cp - 0x10000) modulo 0x400) + 0xDC00cu2 とする
  5. cu1 の後に cu2 が続くコードユニットシーケンスを返す

10.1.2 静的セマンティクス(Static Semantics): UTF16Encode ( text )

6.1.4で説明されているように、この抽象演算は、Unicodeコードポイントのシーケンスである textを文字列値に変換します。

  1. text内の各コードポイントにUTF16Encodingを適用し、結果を順番に文字列連結して返す。

10.1.3 静的セマンティクス(Static Semantics): UTF16DecodeSurrogatePair ( lead, trail )

UTF-16サロゲートペアを形成する2つのコードユニット、leadtrailは、次の手順を実行することによってコードポイントに変換されます。

  1. Assert: lead上位サロゲートtrail下位サロゲート
  2. (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000cp とする
  3. cpのコードポイントを返す

10.1.4 静的セマンティクス(Static Semantics): CodePointAt ( string, position )

抽象演算CodePointAtは、6.1.4で説明されているように、文字列stringをUTF-16エンコードされたコードポイントのシーケンスとして解釈し、インデックスpositionのコードユニットで始まる単一のコードポイントを読み取ります。 呼び出されると、次の手順が実行されます。

  1. string の長さ を size とする
  2. Assert: position0positionsize
  3. string の インデックスposition にあるコードユニットを first とする
  4. first の数値(コードポイント)を cp とする
  5. first上位サロゲート下位サロゲート 以外なら、
    1. Record型 { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }を返す
  6. first下位サロゲート または、 position + 1 = size なら、
    1. Record型 { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }を返す
  7. string の インデックスposition + 1 のコードユニット を second とする
  8. second が 下位サロゲート でないなら、
    1. Record型 { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }を返す
  9. ! UTF16DecodeSurrogatePair(first, second) を cp にセットする
  10. Record型 { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }を返す

10.1.5 静的セマンティクス(Static Semantics): UTF16DecodeString ( string )

この抽象操作は文字列値stringを、6.1.4で説明されているようにUTF-16エンコードされたUnicodeテキストとして解釈し、その結果として得られるUnicodeコードポイントのシーケンスを返します。

  1. 空の新規ListcodePoints とする
  2. string の長さを size とする
  3. 0position とする
  4. positionsize の間繰り返し
    1. ! CodePointAt(string, position) を cp とする
    2. codePointscp.[[CodePoint]] を追加
    3. position + cp.[[CodeUnitCount]] を position にセットする
  5. codePointsを返す

10.2 ソースコードの種類(Types of Source Code)

ECMAScriptコードには4つの種類があります。

関数コードは通常、関数定義(14.1)、アロー関数定義(14.2)、メソッド定義(14.3)、ジェネレーター関数定義(14.4)、非同期関数定義(14.7)、非同期ジェネレーター関数定義(14.5)および非同期アロー関数(14.8)の本体として提供されます。 また、関数コードは、Functionコンストラクター(19.2.1.1)、GeneratorFunctionコンストラクター(25.2.1.1)、およびAsyncFunctionコンストラクター(25.7.1.1)の引数からも派生します。
関数コードに BindingIdentifier を含めると、周囲のコードがstrictモードコードではない場合でも、strictモードコードの初期エラーが、"use strict" ディレクティブを含む関数名の BindingIdentifier に適用されるということです。

10.2.1 strictモードコード(Strict Mode Code)

ECMAScriptスクリプト構文ユニットは、無制限モードまたはStrict(厳密)モードの構文とセマンティクスを使用して処理されます。 次の状況では、コードはstrictモードコードとして解釈されます。

非strictコード

strictモードコードではないECMAScriptコードは、非strict(non-strict)コードと呼ばれます。

10.2.2 非ECMAScript関数(Non-ECMAScript Functions)

ECMAScript実装は、ECMAScriptコードではない実行可能な実装定義形式の関数エキゾチックオブジェクト評価をサポートする場合があります。 関数オブジェクトがECMAScriptコード関数であるか非ECMAScript関数であるかを、非ECMAScript関数を呼び出したり、呼び出されたりするECMAScriptコード関数からは判断できません。