ページ表示設定

13 ECMAScript 言語: 式

13.1 識別子

構文

IdentifierReference[Yield, Await] : Identifier [~Yield] yield [~Await] await BindingIdentifier[Yield, Await] : Identifier yield await LabelIdentifier[Yield, Await] : Identifier [~Yield] yield [~Await] await Identifier : IdentifierName but not ReservedWord 注

yield および await は文法では BindingIdentifier として許可され、以下の静的意味論によって禁止されます。これは、次のような場合にセミコロン自動挿入が行われることを防ぐためです。

let
await 0;

13.1.1 Static Semantics: 早期エラー

BindingIdentifier : Identifier
  • IsStrict(this production) が true であり、Identifier の StringValue が "arguments" または "eval" のいずれかである場合、Syntax Error です。
IdentifierReference : yield BindingIdentifier : yield LabelIdentifier : yield
  • IsStrict(this production) が true である場合、Syntax Error です。
IdentifierReference : await BindingIdentifier : await LabelIdentifier : await
  • 構文文法の目標記号が Module である場合、Syntax Error です。
BindingIdentifier[Yield, Await] : yield
  • この生成規則が [Yield] パラメーターを持つ場合、Syntax Error です。
BindingIdentifier[Yield, Await] : await
  • この生成規則が [Await] パラメーターを持つ場合、Syntax Error です。
IdentifierReference[Yield, Await] : Identifier BindingIdentifier[Yield, Await] : Identifier LabelIdentifier[Yield, Await] : Identifier
  • この生成規則が [Yield] パラメーターを持ち、Identifier の StringValue が "yield" である場合、Syntax Error です。
  • この生成規則が [Await] パラメーターを持ち、Identifier の StringValue が "await" である場合、Syntax Error です。
Identifier : IdentifierName but not ReservedWord 注

IdentifierName の StringValue は、IdentifierName 内のあらゆる Unicode エスケープシーケンスを正規化するため、そのようなエスケープを使用して、コードポイント列が ReservedWord と同じ Identifier を記述することはできません。

13.1.2 Static Semantics: StringValue

構文指向操作 StringValue。引数なし。戻り値:String。 次の生成規則ごとに定義される。

IdentifierName :: IdentifierStart IdentifierName IdentifierPart
  1. nameUnescaped を IdentifierName の IdentifierCodePoints とする。
  2. CodePointsToString(nameUnescaped) を返す。
IdentifierReference : yield BindingIdentifier : yield LabelIdentifier : yield
  1. "yield" を返す。
IdentifierReference : await BindingIdentifier : await LabelIdentifier : await
  1. "await" を返す。
Identifier : IdentifierName but not ReservedWord
  1. IdentifierName の StringValue を返す。
PrivateIdentifier :: # IdentifierName
  1. 0x0023 (NUMBER SIGN) と IdentifierName の StringValue の文字列連結を返す。
ModuleExportName : StringLiteral
  1. StringLiteral の SV を返す。

13.1.3 Runtime Semantics: Evaluation

IdentifierReference : Identifier
  1. ? ResolveBinding(Identifier の StringValue) を返す。
IdentifierReference : yield
  1. ? ResolveBinding("yield") を返す。
IdentifierReference : await
  1. ? ResolveBinding("await") を返す。
注 1

IdentifierReference を評価した結果は、常に Reference 型の値です。

注 2

非 strict コードでは、キーワード yield を識別子として使用できます。IdentifierReference の評価は、yield の束縛を Identifier であるかのように解決します。早期エラーによる制限によって、このような評価は非 strict コードでのみ発生できることが保証されます。

13.2 基本式

構文

PrimaryExpression[Yield, Await] : this IdentifierReference[?Yield, ?Await] Literal ArrayLiteral[?Yield, ?Await] ObjectLiteral[?Yield, ?Await] FunctionExpression ClassExpression[?Yield, ?Await] GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral[?Yield, ?Await, ~Tagged] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : ( ) ( Expression[+In, ?Yield, ?Await] ,opt ) ( ... BindingIdentifier[?Yield, ?Await] ) ( ... BindingPattern[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingIdentifier[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingPattern[?Yield, ?Await] )

補助構文

次の生成規則のインスタンスを処理するとき
PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList の解釈は、次の文法を使用して詳細化されます。

ParenthesizedExpression[Yield, Await] : ( Expression[+In, ?Yield, ?Await] )

13.2.1 this キーワード

13.2.1.1 Runtime Semantics: Evaluation

PrimaryExpression : this
  1. ? ResolveThisBinding() を返す。

13.2.2 識別子参照

IdentifierReference については 13.1 を参照してください。

13.2.3 リテラル

構文

Literal : NullLiteral BooleanLiteral NumericLiteral StringLiteral

13.2.3.1 Runtime Semantics: Evaluation

Literal : NullLiteral
  1. null を返す。
Literal : BooleanLiteral
  1. BooleanLiteral がトークン false である場合、false を返す。
  2. BooleanLiteral がトークン true である場合、true を返す。
Literal : NumericLiteral
  1. 12.9.3 で定義される NumericLiteral の NumericValue を返す。
Literal : StringLiteral
  1. 12.9.4.2 で定義される StringLiteral の SV を返す。

13.2.4 Array 初期化子

注

ArrayLiteral は Array の初期化を記述する式であり、角括弧で囲まれた0個以上の式のリストを使用し、それぞれの式が配列要素を表します。要素はリテラルである必要はなく、配列初期化子が評価されるたびに評価されます。

Array の要素は、要素リストの先頭、中間、または末尾で省略できます。要素リスト内のコンマの直前に AssignmentExpression がない場合(すなわち、先頭のコンマまたは別のコンマの後のコンマ)、欠落した配列要素は Array の長さに寄与し、後続要素のインデックスを増加させます。省略された配列要素は定義されません。配列の末尾で要素が省略された場合、その要素は Array の長さに寄与しません。

構文

ArrayLiteral[Yield, Await] : [ Elisionopt ] [ ElementList[?Yield, ?Await] ] [ ElementList[?Yield, ?Await] , Elisionopt ] ElementList[Yield, Await] : Elisionopt AssignmentExpression[+In, ?Yield, ?Await] Elisionopt SpreadElement[?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt SpreadElement[?Yield, ?Await] Elision : , Elision , SpreadElement[Yield, Await] : ... AssignmentExpression[+In, ?Yield, ?Await]

13.2.4.1 Runtime Semantics: ArrayAccumulation

構文指向操作 ArrayAccumulation。引数 array (Array) および nextIndex (整数)。戻り値:(正常完了 (値:整数) または 中途完了)。 次の生成規則ごとに定義される。

Elision : ,
  1. length を nextIndex + 1 とする。
  2. ? Set(array, "length", 𝔽(length), true) を実行する。
  3. 注記: length が 232 - 1 を超える場合、上の手順はスローする。
  4. length を返す。
Elision : Elision ,
  1. 引数 array および (nextIndex + 1) を指定した Elision の ? ArrayAccumulation を返す。
ElementList : Elisionopt AssignmentExpression
  1. Elision が存在する場合、
    1. nextIndex を、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation に設定する。
  2. initResult を AssignmentExpression の ? Evaluation とする。
  3. initValue を ? GetValue(initResult) とする。
  4. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue) を実行する。
  5. nextIndex + 1 を返す。
ElementList : Elisionopt SpreadElement
  1. Elision が存在する場合、
    1. nextIndex を、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation に設定する。
  2. 引数 array および nextIndex を指定した SpreadElement の ? ArrayAccumulation を返す。
ElementList : ElementList , Elisionopt AssignmentExpression
  1. nextIndex を、引数 array および nextIndex を指定した派生 ElementList の ? ArrayAccumulation に設定する。
  2. Elision が存在する場合、
    1. nextIndex を、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation に設定する。
  3. initResult を AssignmentExpression の ? Evaluation とする。
  4. initValue を ? GetValue(initResult) とする。
  5. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue) を実行する。
  6. nextIndex + 1 を返す。
ElementList : ElementList , Elisionopt SpreadElement
  1. nextIndex を、引数 array および nextIndex を指定した派生 ElementList の ? ArrayAccumulation に設定する。
  2. Elision が存在する場合、
    1. nextIndex を、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation に設定する。
  3. 引数 array および nextIndex を指定した SpreadElement の ? ArrayAccumulation を返す。
SpreadElement : ... AssignmentExpression
  1. spreadRef を AssignmentExpression の ? Evaluation とする。
  2. spreadObj を ? GetValue(spreadRef) とする。
  3. iteratorRecord を ? GetIterator(spreadObj, sync) とする。
  4. 次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done である場合、nextIndex を返す。
    3. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), next) を実行する。
    4. nextIndex を nextIndex + 1 に設定する。
注

標準組込み Array プロトタイプオブジェクトが、[[Set]] を使用した新しい自身のプロパティの作成を妨げるように変更されている場合でも、配列に自身のプロパティが確実に定義されるようにするため、CreateDataPropertyOrThrow が使用されます。

13.2.4.2 Runtime Semantics: Evaluation

ArrayLiteral : [ Elisionopt ]
  1. array を ! ArrayCreate(0) とする。
  2. Elision が存在する場合、
    1. 引数 array および 0 を指定した Elision の ? ArrayAccumulation を実行する。
  3. array を返す。
ArrayLiteral : [ ElementList ]
  1. array を ! ArrayCreate(0) とする。
  2. 引数 array および 0 を指定した ElementList の ? ArrayAccumulation を実行する。
  3. array を返す。
ArrayLiteral : [ ElementList , Elisionopt ]
  1. array を ! ArrayCreate(0) とする。
  2. nextIndex を、引数 array および 0 を指定した ElementList の ? ArrayAccumulation とする。
  3. Elision が存在する場合、
    1. 引数 array および nextIndex を指定した Elision の ? ArrayAccumulation を実行する。
  4. array を返す。

13.2.5 オブジェクト初期化子

注 1

オブジェクト初期化子は、リテラルに似た形式で記述された、Object の初期化を説明する式です。波括弧で囲まれた、0個以上のプロパティキーと対応する値の組のリストです。値はリテラルである必要はなく、オブジェクト初期化子が評価されるたびに評価されます。

構文

ObjectLiteral[Yield, Await] : { } { PropertyDefinitionList[?Yield, ?Await] ,opt } PropertyDefinitionList[Yield, Await] : PropertyDefinition[?Yield, ?Await] PropertyDefinitionList[?Yield, ?Await] , PropertyDefinition[?Yield, ?Await] PropertyDefinition[Yield, Await] : IdentifierReference[?Yield, ?Await] CoverInitializedName[?Yield, ?Await] PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await] MethodDefinition[?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] PropertyName[Yield, Await] : LiteralPropertyName ComputedPropertyName[?Yield, ?Await] LiteralPropertyName : IdentifierName StringLiteral NumericLiteral ComputedPropertyName[Yield, Await] : [ AssignmentExpression[+In, ?Yield, ?Await] ] CoverInitializedName[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] Initializer[In, Yield, Await] : = AssignmentExpression[?In, ?Yield, ?Await] 注 2

MethodDefinition は 15.4 で定義されています。

注 3

CoverInitializedName の意義については次の節を参照してください。

13.2.5.1 Static Semantics: 早期エラー

ObjectLiteral : { PropertyDefinitionList ,opt } 注 1

PropertyNameList が返す List には、ComputedPropertyName を使用して定義されたプロパティ名は含まれません。

PropertyDefinition : MethodDefinition PropertyDefinition : CoverInitializedName 注 2

この仕様の他の箇所には、特定の状況で LeftHandSideExpression が AssignmentPattern を被覆しなければならないことを要求する早期エラー規則があります。その結果、ObjectLiteral は ObjectAssignmentPattern の被覆文法として機能します。CoverInitializedName 生成規則は AssignmentProperty を完全に被覆するために必要ですが、実際のオブジェクト初期化子内では有効ではありません。

具体的には、実際の ObjectLiteral が期待される文脈では、上記の早期エラー規則によって CoverInitializedName の使用が防止されます。しかし、ObjectLiteral が被覆文法として使用される場合、「被覆しなければならない」の意味論によって、ObjectLiteral 内の Parse Node は早期エラー規則の対象とならないため、CoverInitializedName が許可されます。

たとえば、次を考えます。

let o = {f = 1};

{f = 1} は CoverInitializedName を持つ ObjectLiteral として構文解析され、この早期エラー規則によって Syntax Error になります。

これに対して、次を考えます。

({f = 1} = {f: 2});

ここでも {f = 1} は最初に CoverInitializedName を持つ ObjectLiteral として構文解析されますが、これは AssignmentExpression の LeftHandSideExpression であるため、AssignmentPattern を被覆しなければならず、その結果、ObjectLiteral と CoverInitializedName は早期エラー規則の対象になりません。代わりに {f = 1} は AssignmentProperty を持つ ObjectAssignmentPattern として再構文解析され、Syntax Error は発生しません。

13.2.5.2 Static Semantics: IsComputedPropertyKey

構文指向操作 IsComputedPropertyKey。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。

PropertyName : LiteralPropertyName
  1. false を返す。
PropertyName : ComputedPropertyName
  1. true を返す。

13.2.5.3 Static Semantics: PropertyDefinitionNodes

構文指向操作 PropertyDefinitionNodes。引数なし。戻り値:リスト (要素:構文解析ノード)。 次の生成規則ごとに定義される。

ObjectLiteral : { }
  1. 新しい空の List を返す。
PropertyDefinitionList : PropertyDefinition
  1. « PropertyDefinition » を返す。
PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. head を派生 PropertyDefinitionList の PropertyDefinitionNodes とする。
  2. head と « PropertyDefinition » のリスト連結を返す。

13.2.5.4 Static Semantics: PropertyNameList

構文指向操作 PropertyNameList。引数なし。戻り値:リスト (要素:String)。 次の生成規則ごとに定義される。

PropertyDefinitionList : PropertyDefinition
  1. propertyName を PropertyDefinition の PropName とする。
  2. propertyName が empty である場合、新しい空の List を返す。
  3. « propertyName » を返す。
PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. list を PropertyDefinitionList の PropertyNameList とする。
  2. propertyName を PropertyDefinition の PropName とする。
  3. propertyName が empty である場合、list を返す。
  4. list と « propertyName » のリスト連結を返す。

13.2.5.5 Runtime Semantics: Evaluation

ObjectLiteral : { }
  1. OrdinaryObjectCreate(%Object.prototype%) を返す。
ObjectLiteral : { PropertyDefinitionList ,opt }
  1. obj を OrdinaryObjectCreate(%Object.prototype%) とする。
  2. 引数 obj を指定した PropertyDefinitionList の ? PropertyDefinitionEvaluation を実行する。
  3. obj を返す。
LiteralPropertyName : IdentifierName
  1. IdentifierName の StringValue を返す。
LiteralPropertyName : StringLiteral
  1. StringLiteral の SV を返す。
LiteralPropertyName : NumericLiteral
  1. number を NumericLiteral の NumericValue とする。
  2. ! ToString(number) を返す。
ComputedPropertyName : [ AssignmentExpression ]
  1. exprValue を AssignmentExpression の ? Evaluation とする。
  2. propertyName を ? GetValue(exprValue) とする。
  3. ? ToPropertyKey(propertyName) を返す。

13.2.5.6 Runtime Semantics: PropertyDefinitionEvaluation

構文指向操作 PropertyDefinitionEvaluation。引数 obj (Object)。戻り値:(正常完了 (値:unused) または 中途完了)。 次の生成規則ごとに定義される。

PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. 引数 obj を指定した PropertyDefinitionList の ? PropertyDefinitionEvaluation を実行する。
  2. 引数 obj を指定した PropertyDefinition の ? PropertyDefinitionEvaluation を実行する。
  3. unused を返す。
PropertyDefinition : ... AssignmentExpression
  1. exprValue を AssignmentExpression の ? Evaluation とする。
  2. fromValue を ? GetValue(exprValue) とする。
  3. excludedNames を新しい空の List とする。
  4. ? CopyDataProperties(obj, fromValue, excludedNames) を実行する。
  5. unused を返す。
PropertyDefinition : IdentifierReference
  1. propertyName を IdentifierReference の StringValue とする。
  2. exprValue を IdentifierReference の ? Evaluation とする。
  3. propertyValue を ? GetValue(exprValue) とする。
  4. 表明: obj は構成不可のプロパティを持たない、通常の拡張可能なオブジェクトである。
  5. ! CreateDataPropertyOrThrow(obj, propertyName, propertyValue) を実行する。
  6. unused を返す。
PropertyDefinition : PropertyName : AssignmentExpression
  1. propertyKey を PropertyName の ? Evaluation とする。
  2. この PropertyDefinition が、ParseJSON のために評価されている Script 内に含まれる場合(ParseJSON の手順 6 を参照)、
    1. isProtoSetter を false とする。
  3. そうでなく、propertyKey が "__proto__" であり、PropertyName の IsComputedPropertyKey が false である場合、
    1. isProtoSetter を true とする。
  4. そうでない場合、
    1. isProtoSetter を false とする。
  5. IsAnonymousFunctionDefinition(AssignmentExpression) が true であり、isProtoSetter が false である場合、
    1. propertyValue を、引数 propertyKey を指定した AssignmentExpression の ? NamedEvaluation とする。
  6. そうでない場合、
    1. exprValueRef を AssignmentExpression の ? Evaluation とする。
    2. propertyValue を ? GetValue(exprValueRef) とする。
  7. isProtoSetter が true である場合、
    1. propertyValue が Object であるか、propertyValue が null である場合、
      1. ! obj.[[SetPrototypeOf]](propertyValue) を実行する。
    2. unused を返す。
  8. 表明: obj は構成不可のプロパティを持たない、通常の拡張可能なオブジェクトである。
  9. ! CreateDataPropertyOrThrow(obj, propertyKey, propertyValue) を実行する。
  10. unused を返す。
PropertyDefinition : MethodDefinition
  1. result を、引数 obj および true を指定した MethodDefinition の ? MethodDefinitionEvaluation とする。
  2. 表明: result は empty である。
  3. unused を返す。

13.2.6 関数定義式

PrimaryExpression : FunctionExpression については 15.2 を参照してください。

PrimaryExpression : GeneratorExpression については 15.5 を参照してください。

PrimaryExpression : ClassExpression については 15.7 を参照してください。

PrimaryExpression : AsyncFunctionExpression については 15.8 を参照してください。

PrimaryExpression : AsyncGeneratorExpression については 15.6 を参照してください。

13.2.7 正規表現リテラル

構文

12.9.5 を参照してください。

13.2.7.1 Static Semantics: 早期エラー

PrimaryExpression : RegularExpressionLiteral

13.2.7.2 Static Semantics: IsValidRegularExpressionLiteral ( literal )

抽象操作 IsValidRegularExpressionLiteral。引数 literal (a RegularExpressionLiteral Parse Node)。戻り値:Boolean。 引数が有効な正規表現リテラルであるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. flags を literal の FlagText とする。
  2. flags が d、g、i、m、s、u、v、または y 以外のコードポイントを含む場合、false を返す。
  3. flags が同じコードポイントを複数回含む場合、false を返す。
  4. flags が u を含む場合、u を true とする。そうでない場合、u を false とする。
  5. flags が v を含む場合、v を true とする。そうでない場合、v を false とする。
  6. patternText を literal の BodyText とする。
  7. u が false であり、v が false である場合、
    1. stringValue を CodePointsToString(patternText) とする。
    2. patternText を、stringValue の各16ビット要素を Unicode BMP コードポイントとして解釈して得られるコードポイント列に設定する。要素には UTF-16 デコードを適用しない。
  8. parseResult を ParsePattern(patternText, u, v) とする。
  9. parseResult が Parse Node である場合、true を返す。
  10. false を返す。

13.2.7.3 Runtime Semantics: Evaluation

PrimaryExpression : RegularExpressionLiteral
  1. pattern を CodePointsToString(RegularExpressionLiteral の BodyText) とする。
  2. flags を CodePointsToString(RegularExpressionLiteral の FlagText) とする。
  3. ! RegExpCreate(pattern, flags) を返す。

13.2.8 テンプレートリテラル

構文

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate SubstitutionTemplate[?Yield, ?Await] SubstitutionTemplate[Yield, Await] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await] TemplateSpans[Yield, Await] : TemplateTail TemplateMiddleList[?Yield, ?Await] TemplateTail TemplateMiddleList[Yield, Await] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await] TemplateMiddle Expression[+In, ?Yield, ?Await]

13.2.8.1 Static Semantics: 早期エラー

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate
  • [Tagged] パラメーターが設定されておらず、引数 cooked を指定した TemplateLiteral の TemplateStrings が undefined を含む場合、Syntax Error です。
TemplateLiteral[Yield, Await, Tagged] : SubstitutionTemplate[?Yield, ?Await]
  • [Tagged] パラメーターが設定されておらず、引数 cooked を指定した TemplateLiteral の TemplateStrings が undefined を含む場合、Syntax Error です。
  • 引数 cooked を指定した TemplateLiteral の TemplateStrings の要素数が 232 以上である場合、Syntax Error です。

13.2.8.2 Static Semantics: TemplateStrings

構文指向操作 TemplateStrings。引数 escapes ((raw または cooked))。戻り値:リスト (要素:(String または undefined))。 次の生成規則ごとに定義される。

TemplateLiteral : NoSubstitutionTemplate
  1. « TemplateString(NoSubstitutionTemplate, escapes) » を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. head を « TemplateString(TemplateHead, escapes) » とする。
  2. tail を、引数 escapes を指定した TemplateSpans の TemplateStrings とする。
  3. head と tail のリスト連結を返す。
TemplateSpans : TemplateTail
  1. « TemplateString(TemplateTail, escapes) » を返す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. middle を、引数 escapes を指定した TemplateMiddleList の TemplateStrings とする。
  2. tail を « TemplateString(TemplateTail, escapes) » とする。
  3. middle と tail のリスト連結を返す。
TemplateMiddleList : TemplateMiddle Expression
  1. « TemplateString(TemplateMiddle, escapes) » を返す。
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. front を、引数 escapes を指定した TemplateMiddleList の TemplateStrings とする。
  2. last を « TemplateString(TemplateMiddle, escapes) » とする。
  3. front と last のリスト連結を返す。

13.2.8.3 Static Semantics: TemplateString ( templateToken, escapes )

抽象操作 TemplateString。引数 templateToken ((a NoSubstitutionTemplate Parse Node、a TemplateHead Parse Node、a TemplateMiddle Parse Node または a TemplateTail Parse Node)) および escapes ((raw または cooked))。戻り値:(String または undefined)。 呼び出されると、次の手順を実行する。

  1. escapes が raw である場合、templateToken の TRV を返す。
  2. templateToken の TV を返す。
注

この操作は、escapes が raw であり、templateToken が NotEscapeSequence を含む場合、undefined を返します。それ以外のすべての場合では String を返します。

13.2.8.4 GetTemplateObject ( templateLiteral )

抽象操作 GetTemplateObject。引数 templateLiteral (構文解析ノード)。戻り値:Array。 呼び出されると、次の手順を実行する。

  1. realm を現在の Realm Record とする。
  2. templateRegistry を realm.[[TemplateMap]] とする。
  3. templateRegistry の各要素 element について、次を行う。
    1. element.[[Site]] が templateLiteral と同じ Parse Node である場合、
      1. element.[[Array]] を返す。
  4. rawStrings を、引数 raw を指定した templateLiteral の TemplateStrings とする。
  5. 表明: rawStrings は String の List である。
  6. cookedStrings を、引数 cooked を指定した templateLiteral の TemplateStrings とする。
  7. count を List cookedStrings の要素数とする。
  8. 表明: count ≤ 232 - 1。
  9. template を ! ArrayCreate(count) とする。
  10. rawObj を ! ArrayCreate(count) とする。
  11. index を 0 とする。
  12. index < count の間、次を繰り返す。
    1. propertyKey を ! ToString(𝔽(index)) とする。
    2. cookedValue を cookedStrings[index] とする。
    3. ! DefinePropertyOrThrow(template, propertyKey, PropertyDescriptor { [[Value]]: cookedValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }) を実行する。
    4. rawValue を String 値 rawStrings[index] とする。
    5. ! DefinePropertyOrThrow(rawObj, propertyKey, PropertyDescriptor { [[Value]]: rawValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }) を実行する。
    6. index を index + 1 に設定する。
  13. ! SetIntegrityLevel(rawObj, frozen) を実行する。
  14. ! DefinePropertyOrThrow(template, "raw", PropertyDescriptor { [[Value]]: rawObj, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  15. ! SetIntegrityLevel(template, frozen) を実行する。
  16. Record { [[Site]]: templateLiteral, [[Array]]: template } を realm.[[TemplateMap]] に追加する。
  17. template を返す。
注 1

テンプレートオブジェクトの作成が中断完了になることはありません。

注 2

Realm のプログラムコード内の各 TemplateLiteral は、タグ付き Template(13.2.8.6)の評価で使用される一意なテンプレートオブジェクトに関連付けられます。テンプレートオブジェクトは凍結され、特定のタグ付き Template が評価されるたびに同じテンプレートオブジェクトが使用されます。テンプレートオブジェクトを TemplateLiteral の最初の評価時に遅延作成するか、最初の評価前に先行して作成するかは実装上の選択であり、ECMAScript コードから観測できません。

注 3

この仕様の将来の版では、テンプレートオブジェクトの追加の列挙不可プロパティが定義される可能性があります。

13.2.8.5 Runtime Semantics: SubstitutionEvaluation

構文指向操作 SubstitutionEvaluation。引数なし。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値)) または 中途完了)。 次の生成規則ごとに定義される。

TemplateSpans : TemplateTail
  1. 新しい空の List を返す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. TemplateMiddleList の ? SubstitutionEvaluation を返す。
TemplateMiddleList : TemplateMiddle Expression
  1. subRef を Expression の ? Evaluation とする。
  2. sub を ? GetValue(subRef) とする。
  3. « sub » を返す。
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. preceding を TemplateMiddleList の ? SubstitutionEvaluation とする。
  2. nextRef を Expression の ? Evaluation とする。
  3. next を ? GetValue(nextRef) とする。
  4. preceding と « next » のリスト連結を返す。

13.2.8.6 Runtime Semantics: Evaluation

TemplateLiteral : NoSubstitutionTemplate
  1. 12.9.6 で定義される NoSubstitutionTemplate の TV を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. head を、12.9.6 で定義される TemplateHead の TV とする。
  2. subRef を Expression の ? Evaluation とする。
  3. sub を ? GetValue(subRef) とする。
  4. middle を ? ToString(sub) とする。
  5. tail を TemplateSpans の ? Evaluation とする。
  6. head、middle、および tail の文字列連結を返す。
注 1

Expression の値に適用される文字列変換の意味論は、+ 演算子よりも String.prototype.concat に似ています。

TemplateSpans : TemplateTail
  1. 12.9.6 で定義される TemplateTail の TV を返す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. head を TemplateMiddleList の ? Evaluation とする。
  2. tail を、12.9.6 で定義される TemplateTail の TV とする。
  3. head と tail の文字列連結を返す。
TemplateMiddleList : TemplateMiddle Expression
  1. head を、12.9.6 で定義される TemplateMiddle の TV とする。
  2. subRef を Expression の ? Evaluation とする。
  3. sub を ? GetValue(subRef) とする。
  4. middle を ? ToString(sub) とする。
  5. head と middle の文字列連結を返す。
注 2

Expression の値に適用される文字列変換の意味論は、+ 演算子よりも String.prototype.concat に似ています。

TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. rest を TemplateMiddleList の ? Evaluation とする。
  2. middle を、12.9.6 で定義される TemplateMiddle の TV とする。
  3. subRef を Expression の ? Evaluation とする。
  4. sub を ? GetValue(subRef) とする。
  5. last を ? ToString(sub) とする。
  6. rest、middle、および last の文字列連結を返す。
注 3

Expression の値に適用される文字列変換の意味論は、+ 演算子よりも String.prototype.concat に似ています。

13.2.9 グループ化演算子

13.2.9.1 Static Semantics: 早期エラー

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList

13.2.9.2 Runtime Semantics: Evaluation

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。
  2. expr の ? Evaluation を返す。
ParenthesizedExpression : ( Expression )
  1. Expression の ? Evaluation を返す。これは Reference 型である場合があります。
注

このアルゴリズムは、Expression の Evaluation に GetValue を適用しません。その主な理由は、delete や typeof などの演算子を括弧付き式に適用できるようにするためです。

13.3 左辺式

構文

MemberExpression[Yield, Await] : PrimaryExpression[?Yield, ?Await] MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] MemberExpression[?Yield, ?Await] . IdentifierName MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] SuperProperty[?Yield, ?Await] MetaProperty new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] MemberExpression[?Yield, ?Await] . PrivateIdentifier SuperProperty[Yield, Await] : super [ Expression[+In, ?Yield, ?Await] ] super . IdentifierName MetaProperty : NewTarget ImportMeta NewTarget : new . target ImportMeta : import . meta NewExpression[Yield, Await] : MemberExpression[?Yield, ?Await] new NewExpression[?Yield, ?Await] CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] SuperCall[?Yield, ?Await] ImportCall[?Yield, ?Await] CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await] CallExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] CallExpression[?Yield, ?Await] . IdentifierName CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] CallExpression[?Yield, ?Await] . PrivateIdentifier SuperCall[Yield, Await] : super Arguments[?Yield, ?Await] ImportCall[Yield, Await] : import ( AssignmentExpression[+In, ?Yield, ?Await] ,opt ) import ( AssignmentExpression[+In, ?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ,opt ) Arguments[Yield, Await] : ( ) ( ArgumentList[?Yield, ?Await] ,opt ) ArgumentList[Yield, Await] : AssignmentExpression[+In, ?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await] OptionalExpression[Yield, Await] : MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalChain[Yield, Await] : ?. Arguments[?Yield, ?Await] ?. [ Expression[+In, ?Yield, ?Await] ] ?. IdentifierName ?. TemplateLiteral[?Yield, ?Await, +Tagged] ?. PrivateIdentifier OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await] OptionalChain[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] OptionalChain[?Yield, ?Await] . IdentifierName OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] OptionalChain[?Yield, ?Await] . PrivateIdentifier LeftHandSideExpression[Yield, Await] : NewExpression[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalExpression[?Yield, ?Await]

補助構文

次の生成規則のインスタンスを処理するとき
CallExpression : CoverCallExpressionAndAsyncArrowHead
CoverCallExpressionAndAsyncArrowHead の解釈は、次の文法を使用して詳細化されます。

CallMemberExpression[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

13.3.1 静的意味論

13.3.1.1 Static Semantics: 早期エラー

OptionalChain : ?. TemplateLiteral OptionalChain TemplateLiteral 注

この生成規則は、次のコードにセミコロン自動挿入規則(12.10)が適用されるのを防ぐために存在します。

a?.b
`c`

これにより、2つの有効な文として解釈されることを防ぎます。その目的は、オプショナルチェーンを使用しない次の類似コードとの一貫性を保つことです。

a.b
`c`

これは有効な文であり、セミコロン自動挿入は適用されません。

ImportMeta : import . meta
  • 構文上の目標記号が Module でない場合、Syntax Error です。

13.3.2 プロパティアクセサー

注

プロパティには、次のドット記法を使用して名前でアクセスできます。

または、次の括弧記法を使用します。

ドット記法は、次の構文変換によって説明されます。

は、動作上、次と同一です。

MemberExpression [ <identifier-name-string> ]

同様に、

は、動作上、次と同一です。

CallExpression [ <identifier-name-string> ]

ここで <identifier-name-string> は IdentifierName の StringValue です。

13.3.2.1 Runtime Semantics: Evaluation

MemberExpression : MemberExpression [ Expression ]
  1. baseRef を MemberExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. strict を IsStrict(this MemberExpression) とする。
  4. ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict) を返す。
MemberExpression : MemberExpression . IdentifierName
  1. baseRef を MemberExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. strict を IsStrict(this MemberExpression) とする。
  4. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict) を返す。
MemberExpression : MemberExpression . PrivateIdentifier
  1. baseRef を MemberExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. fieldNameString を PrivateIdentifier の StringValue とする。
  4. MakePrivateReference(baseValue, fieldNameString) を返す。
CallExpression : CallExpression [ Expression ]
  1. baseRef を CallExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. strict を IsStrict(this CallExpression) とする。
  4. ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict) を返す。
CallExpression : CallExpression . IdentifierName
  1. baseRef を CallExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. strict を IsStrict(this CallExpression) とする。
  4. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict) を返す。
CallExpression : CallExpression . PrivateIdentifier
  1. baseRef を CallExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. fieldNameString を PrivateIdentifier の StringValue とする。
  4. MakePrivateReference(baseValue, fieldNameString) を返す。

13.3.3 EvaluatePropertyAccessWithExpressionKey ( baseValue, expr, strict )

抽象操作 EvaluatePropertyAccessWithExpressionKey。引数 baseValue (ECMAScript 言語値)、expr (an Expression Parse Node) および strict (Boolean)。戻り値:(正常完了 (値:Referenceレコード) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. propertyNameRef を expr の ? Evaluation とする。
  2. propertyNameValue を ? GetValue(propertyNameRef) とする。
  3. 注記: ほとんどの場合、この手順の直後に propertyNameValue に対して ToPropertyKey が実行される。ただし、a[b] = c の場合、c の評価後まで実行されない。
  4. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameValue, [[Strict]]: strict, [[ThisValue]]: empty } を返す。

13.3.4 EvaluatePropertyAccessWithIdentifierKey ( baseValue, identifierName, strict )

抽象操作 EvaluatePropertyAccessWithIdentifierKey。引数 baseValue (ECMAScript 言語値)、identifierName (an IdentifierName Parse Node) および strict (Boolean)。戻り値:Referenceレコード。 呼び出されると、次の手順を実行する。

  1. propertyNameString を identifierName の StringValue とする。
  2. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameString, [[Strict]]: strict, [[ThisValue]]: empty } を返す。

13.3.5 new 演算子

13.3.5.1 Runtime Semantics: Evaluation

NewExpression : new NewExpression
  1. ? EvaluateNew(NewExpression, empty) を返す。
MemberExpression : new MemberExpression Arguments
  1. ? EvaluateNew(MemberExpression, Arguments) を返す。

13.3.5.1.1 EvaluateNew ( constructExpr, argumentsNode )

抽象操作 EvaluateNew。引数 constructExpr ((a NewExpression Parse Node または a MemberExpression Parse Node)) および argumentsNode ((empty または an Arguments Parse Node))。戻り値:(正常完了 (値:Object) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. ref を constructExpr の ? Evaluation とする。
  2. ctor を ? GetValue(ref) とする。
  3. argumentsNode が empty である場合、
    1. argList を新しい空の List とする。
  4. そうでない場合、
    1. argList を argumentsNode の ? ArgumentListEvaluation とする。
  5. IsConstructor(ctor) が false である場合、TypeError 例外をスローする。
  6. ? Construct(ctor, argList) を返す。

13.3.6 関数呼出し

13.3.6.1 Runtime Semantics: Evaluation

CallExpression : CoverCallExpressionAndAsyncArrowHead
  1. expr を CoverCallExpressionAndAsyncArrowHead によって被覆される CallMemberExpression とする。
  2. memberExpr を expr の MemberExpression とする。
  3. args を expr の Arguments とする。
  4. ref を memberExpr の ? Evaluation とする。
  5. func を ? GetValue(ref) とする。
  6. ref が Reference Record であり、IsPropertyReference(ref) が false であり、ref.[[ReferencedName]] が "eval" である場合、
    1. SameValue(func, %eval%) が true である場合、
      1. argList を args の ? ArgumentListEvaluation とする。
      2. argList が要素を持たない場合、undefined を返す。
      3. evalArg を argList の最初の要素とする。
      4. IsStrict(this CallExpression) が true である場合、strictCaller を true とする。そうでない場合、strictCaller を false とする。
      5. ? PerformEval(evalArg, strictCaller, true) を返す。
  7. thisCall をこの CallExpression とする。
  8. tailCall を IsInTailPosition(thisCall) とする。
  9. ? EvaluateCall(func, ref, args, tailCall) を返す。

手順 6.a.v を実行する CallExpression の評価を direct eval と呼びます。

CallExpression : CallExpression Arguments
  1. ref を CallExpression の ? Evaluation とする。
  2. func を ? GetValue(ref) とする。
  3. thisCall をこの CallExpression とする。
  4. tailCall を IsInTailPosition(thisCall) とする。
  5. ? EvaluateCall(func, ref, Arguments, tailCall) を返す。

13.3.6.2 EvaluateCall ( func, thisValueRef, argumentListNode, tailPosition )

抽象操作 EvaluateCall。引数 func (ECMAScript 言語値)、thisValueRef ((ECMAScript 言語値 または Referenceレコード))、argumentListNode (構文解析ノード) および tailPosition (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. thisValueRef が Reference Record である場合、
    1. IsPropertyReference(thisValueRef) が true である場合、
      1. thisValue を GetThisValue(thisValueRef) とする。
    2. そうでない場合、
      1. refEnv を thisValueRef.[[Base]] とする。
      2. 表明: refEnv は Environment Record である。
      3. thisValue を refEnv.WithBaseObject() とする。
  2. そうでない場合、
    1. thisValue を undefined とする。
  3. argList を argumentListNode の ? ArgumentListEvaluation とする。
  4. func が Object でない場合、TypeError 例外をスローする。
  5. IsCallable(func) が false である場合、TypeError 例外をスローする。
  6. tailPosition が true である場合、PrepareForTailCall() を実行する。
  7. ? Call(func, thisValue, argList) を返す。

13.3.7 super キーワード

13.3.7.1 Runtime Semantics: Evaluation

SuperProperty : super [ Expression ]
  1. envRecord を GetThisEnvironment() とする。
  2. actualThis を ? envRecord.GetThisBinding() とする。
  3. propertyNameRef を Expression の ? Evaluation とする。
  4. propertyNameValue を ? GetValue(propertyNameRef) とする。
  5. strict を IsStrict(this SuperProperty) とする。
  6. 注記: ほとんどの場合、この手順の直後に propertyNameValue に対して ToPropertyKey が実行される。ただし、super[b] = c の場合、c の評価後まで実行されない。
  7. MakeSuperPropertyReference(actualThis, propertyNameValue, strict) を返す。
SuperProperty : super . IdentifierName
  1. envRecord を GetThisEnvironment() とする。
  2. actualThis を ? envRecord.GetThisBinding() とする。
  3. propertyKey を IdentifierName の StringValue とする。
  4. strict を IsStrict(this SuperProperty) とする。
  5. MakeSuperPropertyReference(actualThis, propertyKey, strict) を返す。
SuperCall : super Arguments
  1. newTarget を GetNewTarget() とする。
  2. 表明: newTarget はコンストラクターである。
  3. superCtor を GetSuperConstructor() とする。
  4. argList を Arguments の ? ArgumentListEvaluation とする。
  5. IsConstructor(superCtor) が false である場合、TypeError 例外をスローする。
  6. result を ? Construct(superCtor, argList, newTarget) とする。
  7. thisER を GetThisEnvironment() とする。
  8. 表明: thisER は Function Environment Record である。
  9. ? BindThisValue(thisER, result) を実行する。
  10. funcObj を thisER.[[FunctionObject]] とする。
  11. 表明: funcObj は ECMAScript 関数オブジェクトである。
  12. ? InitializeInstanceElements(result, funcObj) を実行する。
  13. result を返す。

13.3.7.2 GetSuperConstructor ( )

抽象操作 GetSuperConstructor。引数なし。戻り値:(Object または null)。 呼び出されると、次の手順を実行する。

  1. envRecord を GetThisEnvironment() とする。
  2. 表明: envRecord は Function Environment Record である。
  3. activeFunc を envRecord.[[FunctionObject]] とする。
  4. 表明: activeFunc は ECMAScript 関数オブジェクトである。
  5. superCtor を ! activeFunc.[[GetPrototypeOf]]() とする。
  6. superCtor を返す。

13.3.7.3 MakeSuperPropertyReference ( actualThis, propertyKey, strict )

抽象操作 MakeSuperPropertyReference。引数 actualThis (ECMAScript 言語値)、propertyKey (ECMAScript 言語値) および strict (Boolean)。戻り値:Super Referenceレコード。 呼び出されると、次の手順を実行する。

  1. envRecord を GetThisEnvironment() とする。
  2. 表明: envRecord.HasSuperBinding() は true である。
  3. 表明: envRecord は Function Environment Record である。
  4. baseValue を GetSuperBase(envRecord) とする。
  5. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyKey, [[Strict]]: strict, [[ThisValue]]: actualThis } を返す。

13.3.8 引数リスト

注

引数リストの評価は値の List を生成します。

13.3.8.1 Runtime Semantics: ArgumentListEvaluation

構文指向操作 ArgumentListEvaluation。引数なし。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値)) または 中途完了)。 次の生成規則ごとに定義される。

Arguments : ( )
  1. 新しい空の List を返す。
ArgumentList : AssignmentExpression
  1. ref を AssignmentExpression の ? Evaluation とする。
  2. arg を ? GetValue(ref) とする。
  3. « arg » を返す。
ArgumentList : ... AssignmentExpression
  1. list を新しい空の List とする。
  2. spreadRef を AssignmentExpression の ? Evaluation とする。
  3. spreadObj を ? GetValue(spreadRef) とする。
  4. iteratorRecord を ? GetIterator(spreadObj, sync) とする。
  5. 次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done である場合、list を返す。
    3. next を list に追加する。
ArgumentList : ArgumentList , AssignmentExpression
  1. precedingArgs を ArgumentList の ? ArgumentListEvaluation とする。
  2. ref を AssignmentExpression の ? Evaluation とする。
  3. arg を ? GetValue(ref) とする。
  4. precedingArgs と « arg » のリスト連結を返す。
ArgumentList : ArgumentList , ... AssignmentExpression
  1. precedingArgs を ArgumentList の ? ArgumentListEvaluation とする。
  2. spreadRef を AssignmentExpression の ? Evaluation とする。
  3. iteratorRecord を ? GetIterator(? GetValue(spreadRef), sync) とする。
  4. 次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done である場合、precedingArgs を返す。
    3. next を precedingArgs に追加する。
TemplateLiteral : NoSubstitutionTemplate
  1. templateLiteral をこの TemplateLiteral とする。
  2. siteObj を GetTemplateObject(templateLiteral) とする。
  3. « siteObj » を返す。
TemplateLiteral : SubstitutionTemplate
  1. templateLiteral をこの TemplateLiteral とする。
  2. siteObj を GetTemplateObject(templateLiteral) とする。
  3. remaining を SubstitutionTemplate の ? ArgumentListEvaluation とする。
  4. « siteObj » と remaining のリスト連結を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. firstSubRef を Expression の ? Evaluation とする。
  2. firstSub を ? GetValue(firstSubRef) とする。
  3. restSub を TemplateSpans の ? SubstitutionEvaluation とする。
  4. 表明: restSub は空である可能性のある List である。
  5. « firstSub » と restSub のリスト連結を返す。

13.3.9 オプショナルチェーン

注
オプショナルチェーンは、1つ以上のプロパティアクセスおよび関数呼出しのチェーンであり、その最初のものがトークン ?. で始まります。

13.3.9.1 Runtime Semantics: Evaluation

OptionalExpression : MemberExpression OptionalChain
  1. baseRef を MemberExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. baseValue が undefined または null のいずれかである場合、
    1. undefined を返す。
  4. 引数 baseValue および baseRef を指定した OptionalChain の ? ChainEvaluation を返す。
OptionalExpression : CallExpression OptionalChain
  1. baseRef を CallExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. baseValue が undefined または null のいずれかである場合、
    1. undefined を返す。
  4. 引数 baseValue および baseRef を指定した OptionalChain の ? ChainEvaluation を返す。
OptionalExpression : OptionalExpression OptionalChain
  1. baseRef を OptionalExpression の ? Evaluation とする。
  2. baseValue を ? GetValue(baseRef) とする。
  3. baseValue が undefined または null のいずれかである場合、
    1. undefined を返す。
  4. 引数 baseValue および baseRef を指定した OptionalChain の ? ChainEvaluation を返す。

13.3.9.2 Runtime Semantics: ChainEvaluation

構文指向操作 ChainEvaluation。引数 baseValue (ECMAScript 言語値) および baseRef ((ECMAScript 言語値 または Referenceレコード))。戻り値:(正常完了 (値:(ECMAScript 言語値 または Referenceレコード)) または 中途完了)。 次の生成規則ごとに定義される。

OptionalChain : ?. Arguments
  1. thisChain をこの OptionalChain とする。
  2. tailCall を IsInTailPosition(thisChain) とする。
  3. ? EvaluateCall(baseValue, baseRef, Arguments, tailCall) を返す。
OptionalChain : ?. [ Expression ]
  1. strict を IsStrict(this OptionalChain) とする。
  2. ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict) を返す。
OptionalChain : ?. IdentifierName
  1. strict を IsStrict(this OptionalChain) とする。
  2. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict) を返す。
OptionalChain : ?. PrivateIdentifier
  1. fieldNameString を PrivateIdentifier の StringValue とする。
  2. MakePrivateReference(baseValue, fieldNameString) を返す。
OptionalChain : OptionalChain Arguments
  1. optionalChain を OptionalChain とする。
  2. newRef を、引数 baseValue および baseRef を指定した optionalChain の ? ChainEvaluation とする。
  3. newValue を ? GetValue(newRef) とする。
  4. thisChain をこの OptionalChain とする。
  5. tailCall を IsInTailPosition(thisChain) とする。
  6. ? EvaluateCall(newValue, newRef, Arguments, tailCall) を返す。
OptionalChain : OptionalChain [ Expression ]
  1. optionalChain を OptionalChain とする。
  2. newRef を、引数 baseValue および baseRef を指定した optionalChain の ? ChainEvaluation とする。
  3. newValue を ? GetValue(newRef) とする。
  4. strict を IsStrict(this OptionalChain) とする。
  5. ? EvaluatePropertyAccessWithExpressionKey(newValue, Expression, strict) を返す。
OptionalChain : OptionalChain . IdentifierName
  1. optionalChain を OptionalChain とする。
  2. newRef を、引数 baseValue および baseRef を指定した optionalChain の ? ChainEvaluation とする。
  3. newValue を ? GetValue(newRef) とする。
  4. strict を IsStrict(this OptionalChain) とする。
  5. EvaluatePropertyAccessWithIdentifierKey(newValue, IdentifierName, strict) を返す。
OptionalChain : OptionalChain . PrivateIdentifier
  1. optionalChain を OptionalChain とする。
  2. newRef を、引数 baseValue および baseRef を指定した optionalChain の ? ChainEvaluation とする。
  3. newValue を ? GetValue(newRef) とする。
  4. fieldNameString を PrivateIdentifier の StringValue とする。
  5. MakePrivateReference(newValue, fieldNameString) を返す。

13.3.10 Import 呼出し

13.3.10.1 Runtime Semantics: Evaluation

ImportCall : import ( AssignmentExpression ,opt )
  1. ? EvaluateImportCall(AssignmentExpression) を返す。
ImportCall : import ( AssignmentExpression , AssignmentExpression ,opt )
  1. ? EvaluateImportCall(最初の AssignmentExpression, 2番目の AssignmentExpression) を返す。

13.3.10.2 EvaluateImportCall ( specifierExpr [ , optionsExpr ] )

抽象操作 EvaluateImportCall。引数 specifierExpr (構文解析ノード)および省略可能な引数 optionsExpr (構文解析ノード)。戻り値:(正常完了 (値:Promise) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. referrer を GetActiveScriptOrModule() とする。
  2. referrer が null である場合、referrer を現在の Realm Record に設定する。
  3. specifierRef を specifierExpr の ? Evaluation とする。
  4. specifier を ? GetValue(specifierRef) とする。
  5. optionsExpr が存在する場合、
    1. optionsRef を optionsExpr の ? Evaluation とする。
    2. options を ? GetValue(optionsRef) とする。
  6. そうでない場合、
    1. options を undefined とする。
  7. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  8. specifierString を Completion(ToString(specifier)) とする。
  9. IfAbruptRejectPromise(specifierString, promiseCapability)。
  10. attrs を新しい空の List とする。
  11. options が undefined でない場合、
    1. options が Object でない場合、
      1. ! Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
      2. promiseCapability.[[Promise]] を返す。
    2. attrsObj を Completion(Get(options, "with")) とする。
    3. IfAbruptRejectPromise(attrsObj, promiseCapability)。
    4. attrsObj が undefined でない場合、
      1. attrsObj が Object でない場合、
        1. ! Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
        2. promiseCapability.[[Promise]] を返す。
      2. entries を Completion(EnumerableOwnProperties(attrsObj, key+value)) とする。
      3. IfAbruptRejectPromise(entries, promiseCapability)。
      4. entries の各要素 entry について、次を行う。
        1. key を ! Get(entry, "0") とする。
        2. value を ! Get(entry, "1") とする。
        3. key が String である場合、
          1. value が String でない場合、
            1. ! Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
            2. promiseCapability.[[Promise]] を返す。
          2. ImportAttribute Record { [[Key]]: key, [[Value]]: value } を attrs に追加する。
    5. AllImportAttributesSupported(attrs) が false である場合、
      1. ! Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
      2. promiseCapability.[[Promise]] を返す。
    6. attrs を、その [[Key]] フィールドの辞書式順序に従って並べ替える。各フィールドの値は UTF-16 コード単位値の列として扱う。注記: この並べ替えが観測可能なのは、属性が列挙された順序に基づいてホストが動作を変更することを禁止されるという点だけである。
  12. moduleRequest を新しい ModuleRequest Record { [[Specifier]]: specifierString, [[Attributes]]: attrs } とする。
  13. HostLoadImportedModule(referrer, moduleRequest, empty, promiseCapability) を実行する。
  14. promiseCapability.[[Promise]] を返す。

13.3.10.3 ContinueDynamicImport ( promiseCapability, moduleCompletion )

抽象操作 ContinueDynamicImport。引数 promiseCapability (PromiseCapabilityレコード) および moduleCompletion ((正常完了 (値:Moduleレコード) または throw 完了))。戻り値:unused。 import() 呼出しによって最初に開始された動的インポートの処理を完了し、その呼出しによって返された Promise を適切に解決または拒否します。 呼び出されると、次の手順を実行する。

  1. moduleCompletion が中断完了である場合、
    1. ! Call(promiseCapability.[[Reject]], undefined, « moduleCompletion.[[Value]] ») を実行する。
    2. unused を返す。
  2. module を moduleCompletion.[[Value]] とする。
  3. loadPromise を module.LoadRequestedModules() とする。
  4. rejectedClosure を、パラメーター (reason) を持ち、promiseCapability を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. ! Call(promiseCapability.[[Reject]], undefined, « reason ») を実行する。
    2. NormalCompletion(undefined) を返す。
  5. onRejected を CreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  6. linkAndEvaluateClosure を、パラメーターを持たず、module、promiseCapability、および onRejected を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. link を Completion(module.Link()) とする。
    2. link が中断完了である場合、
      1. ! Call(promiseCapability.[[Reject]], undefined, « link.[[Value]] ») を実行する。
      2. NormalCompletion(undefined) を返す。
    3. evaluatePromise を module.Evaluate() とする。
    4. fulfilledClosure を、パラメーターを持たず、module および promiseCapability を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
      1. namespace を GetModuleNamespace(module) とする。
      2. ! Call(promiseCapability.[[Resolve]], undefined, « namespace ») を実行する。
      3. NormalCompletion(undefined) を返す。
    5. onFulfilled を CreateBuiltinFunction(fulfilledClosure, 0, "", « ») とする。
    6. PerformPromiseThen(evaluatePromise, onFulfilled, onRejected) を実行する。
    7. unused を返す。
  7. linkAndEvaluate を CreateBuiltinFunction(linkAndEvaluateClosure, 0, "", « ») とする。
  8. PerformPromiseThen(loadPromise, linkAndEvaluate, onRejected) を実行する。
  9. unused を返す。

13.3.11 タグ付きテンプレート

注

タグ付きテンプレートは、呼出しの引数が TemplateLiteral(13.2.8)から導出される関数呼出しです。実際の引数には、テンプレートオブジェクト(13.2.8.4)と、TemplateLiteral 内に埋め込まれた式を評価して生成される値が含まれます。

13.3.11.1 Runtime Semantics: Evaluation

MemberExpression : MemberExpression TemplateLiteral
  1. tagRef を MemberExpression の ? Evaluation とする。
  2. tagFunc を ? GetValue(tagRef) とする。
  3. thisCall をこの MemberExpression とする。
  4. tailCall を IsInTailPosition(thisCall) とする。
  5. ? EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall) を返す。
CallExpression : CallExpression TemplateLiteral
  1. tagRef を CallExpression の ? Evaluation とする。
  2. tagFunc を ? GetValue(tagRef) とする。
  3. thisCall をこの CallExpression とする。
  4. tailCall を IsInTailPosition(thisCall) とする。
  5. ? EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall) を返す。

13.3.12 メタプロパティ

13.3.12.1 Runtime Semantics: Evaluation

NewTarget : new . target
  1. GetNewTarget() を返す。
ImportMeta : import . meta
  1. module を GetActiveScriptOrModule() とする。
  2. 表明: module は Source Text Module Record である。
  3. importMeta を module.[[ImportMeta]] とする。
  4. importMeta が empty である場合、
    1. importMeta を OrdinaryObjectCreate(null) に設定する。
    2. importMetaValues を HostGetImportMetaProperties(module) とする。
    3. importMetaValues の各 Record { [[Key]], [[Value]] } entry について、次を行う。
      1. ! CreateDataPropertyOrThrow(importMeta, entry.[[Key]], entry.[[Value]]) を実行する。
    4. HostFinalizeImportMeta(importMeta, module) を実行する。
    5. module.[[ImportMeta]] を importMeta に設定する。
    6. importMeta を返す。
  5. 表明: importMeta は Object である。
  6. importMeta を返す。

13.3.12.1.1 HostGetImportMetaProperties ( moduleRecord )

ホスト定義の抽象操作 HostGetImportMetaProperties。引数 moduleRecord (Moduleレコード)。戻り値:リスト (要素:レコード (フィールド:[[Key]] (プロパティキー), [[Value]] (ECMAScript 言語値)))。 ホストが import.meta から返されるオブジェクトにプロパティキーと値を提供できるようにします。

HostGetImportMetaProperties の既定の実装は、新しい空の List を返すことです。

13.3.12.1.2 HostFinalizeImportMeta ( importMeta, moduleRecord )

ホスト定義の抽象操作 HostFinalizeImportMeta。引数 importMeta (Object) および moduleRecord (Moduleレコード)。戻り値:unused。 ホストが import.meta から返されるオブジェクトを準備するために、通常ではない操作を実行できるようにします。

ほとんどのホストは、単に HostGetImportMetaProperties を定義し、HostFinalizeImportMeta を既定の動作のままにすることができます。ただし、HostFinalizeImportMeta は、ECMAScript コードに公開される前にオブジェクトを直接操作する必要があるホストのための「逃げ道」を提供します。

HostFinalizeImportMeta の既定の実装は unused を返すことです。

13.4 更新式

構文

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ++ UnaryExpression[?Yield, ?Await] -- UnaryExpression[?Yield, ?Await]

13.4.1 Static Semantics: 早期エラー

UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- UpdateExpression : ++ UnaryExpression -- UnaryExpression

13.4.2 後置インクリメント演算子

13.4.2.1 Runtime Semantics: Evaluation

UpdateExpression : LeftHandSideExpression ++
  1. lhs を LeftHandSideExpression の ? Evaluation とする。
  2. LeftHandSideExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。
  3. oldValue を ? ToNumeric(? GetValue(lhs)) とする。
  4. oldValue が Number である場合、
    1. newValue を Number::add(oldValue, 1𝔽) とする。
  5. そうでない場合、
    1. 表明: oldValue は BigInt である。
    2. newValue を BigInt::add(oldValue, 1ℤ) とする。
  6. ? PutValue(lhs, newValue) を実行する。
  7. oldValue を返す。

13.4.3 後置デクリメント演算子

13.4.3.1 Runtime Semantics: Evaluation

UpdateExpression : LeftHandSideExpression --
  1. lhs を LeftHandSideExpression の ? Evaluation とする。
  2. LeftHandSideExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。
  3. oldValue を ? ToNumeric(? GetValue(lhs)) とする。
  4. oldValue が Number である場合、
    1. newValue を Number::subtract(oldValue, 1𝔽) とする。
  5. そうでない場合、
    1. 表明: oldValue は BigInt である。
    2. newValue を BigInt::subtract(oldValue, 1ℤ) とする。
  6. ? PutValue(lhs, newValue) を実行する。
  7. oldValue を返す。

13.4.4 前置インクリメント演算子

13.4.4.1 Runtime Semantics: Evaluation

UpdateExpression : ++ UnaryExpression
  1. expr を UnaryExpression の ? Evaluation とする。
  2. UnaryExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。
  3. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  4. oldValue が Number である場合、
    1. newValue を Number::add(oldValue, 1𝔽) とする。
  5. そうでない場合、
    1. 表明: oldValue は BigInt である。
    2. newValue を BigInt::add(oldValue, 1ℤ) とする。
  6. ? PutValue(expr, newValue) を実行する。
  7. newValue を返す。

13.4.5 前置デクリメント演算子

13.4.5.1 Runtime Semantics: Evaluation

UpdateExpression : -- UnaryExpression
  1. expr を UnaryExpression の ? Evaluation とする。
  2. UnaryExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。
  3. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  4. oldValue が Number である場合、
    1. newValue を Number::subtract(oldValue, 1𝔽) とする。
  5. そうでない場合、
    1. 表明: oldValue は BigInt である。
    2. newValue を BigInt::subtract(oldValue, 1ℤ) とする。
  6. ? PutValue(expr, newValue) を実行する。
  7. newValue を返す。

13.5 単項演算子

構文

UnaryExpression[Yield, Await] : UpdateExpression[?Yield, ?Await] delete UnaryExpression[?Yield, ?Await] void UnaryExpression[?Yield, ?Await] typeof UnaryExpression[?Yield, ?Await] + UnaryExpression[?Yield, ?Await] - UnaryExpression[?Yield, ?Await] ~ UnaryExpression[?Yield, ?Await] ! UnaryExpression[?Yield, ?Await] [+Await] CoverAwaitExpressionAndAwaitUsingDeclarationHead[?Yield] CoverAwaitExpressionAndAwaitUsingDeclarationHead[Yield] : await UnaryExpression[?Yield, +Await]

補助構文

次の生成規則のインスタンスを処理するとき
UnaryExpression : CoverAwaitExpressionAndAwaitUsingDeclarationHead
CoverAwaitExpressionAndAwaitUsingDeclarationHead の解釈は、次の文法を使用して詳細化されます。

AwaitExpression[Yield] : await UnaryExpression[?Yield, +Await]

13.5.1 delete 演算子

13.5.1.1 Static Semantics: 早期エラー

UnaryExpression : delete UnaryExpression 注

最後の規則は、delete (((foo))) のような式が、最初の規則の再帰的適用によって早期エラーを生成することを意味します。

13.5.1.2 Runtime Semantics: Evaluation

UnaryExpression : delete UnaryExpression
  1. ref を UnaryExpression の ? Evaluation とする。
  2. ref が Reference Record でない場合、true を返す。
  3. IsUnresolvableReference(ref) が true である場合、
    1. 表明: ref.[[Strict]] は false である。
    2. true を返す。
  4. IsPropertyReference(ref) が true である場合、
    1. 表明: IsPrivateReference(ref) は false である。
    2. IsSuperReference(ref) が true である場合、ReferenceError 例外をスローする。
    3. baseObj を ? ToObject(ref.[[Base]]) とする。
    4. ref.[[ReferencedName]] がプロパティキーでない場合、
      1. ref.[[ReferencedName]] を ? ToPropertyKey(ref.[[ReferencedName]]) に設定する。
    5. deleteStatus を ? baseObj.[[Delete]](ref.[[ReferencedName]]) とする。
    6. deleteStatus が false であり、ref.[[Strict]] が true である場合、TypeError 例外をスローする。
    7. deleteStatus を返す。
  5. base を ref.[[Base]] とする。
  6. 表明: base は Environment Record である。
  7. ? base.DeleteBinding(ref.[[ReferencedName]]) を返す。
注 1

strict モードコード内に delete 演算子が現れる場合、その UnaryExpression が変数、関数引数、または関数名への直接参照であれば、SyntaxError 例外がスローされます。さらに、strict モードコード内に delete 演算子が現れ、削除されるプロパティが属性 { [[Configurable]]: false } を持つ場合(またはその他の理由で削除できない場合)、TypeError 例外がスローされます。

注 2

手順 4.c で作成される可能性のあるオブジェクトは、上記の抽象操作と通常オブジェクトの [[Delete]] 内部メソッドの外部からアクセスできません。実装は、そのオブジェクトを実際には作成しないことを選択してもかまいません。

13.5.2 void 演算子

13.5.2.1 Runtime Semantics: Evaluation

UnaryExpression : void UnaryExpression
  1. expr を UnaryExpression の ? Evaluation とする。
  2. ? GetValue(expr) を実行する。
  3. undefined を返す。
注

GetValue の値は使用されませんが、観測可能な副作用を持つ可能性があるため、GetValue を呼び出さなければなりません。

13.5.3 typeof 演算子

13.5.3.1 Runtime Semantics: Evaluation

UnaryExpression : typeof UnaryExpression
  1. value を UnaryExpression の ? Evaluation とする。
  2. value が Reference Record である場合、
    1. IsUnresolvableReference(value) が true である場合、"undefined" を返す。
  3. value を ? GetValue(value) に設定する。
  4. value が undefined である場合、"undefined" を返す。
  5. value が null である場合、"object" を返す。
  6. value が String である場合、"string" を返す。
  7. value が Symbol である場合、"symbol" を返す。
  8. value が Boolean である場合、"boolean" を返す。
  9. value が Number である場合、"number" を返す。
  10. value が BigInt である場合、"bigint" を返す。
  11. 表明: value は Object である。
  12. Normative Optional
    ホストが Web ブラウザーであるか、その他の方法で [[IsHTMLDDA]] 内部スロット をサポートする場合、
    1. value が [[IsHTMLDDA]] 内部スロットを持つ場合、"undefined" を返す。
  13. value が [[Call]] 内部メソッドを持つ場合、"function" を返す。
  14. "object" を返す。

13.5.4 単項 + 演算子

注

単項 + 演算子は、そのオペランドを Number 型に変換します。

13.5.4.1 Runtime Semantics: Evaluation

UnaryExpression : + UnaryExpression
  1. expr を UnaryExpression の ? Evaluation とする。
  2. ? ToNumber(? GetValue(expr)) を返す。

13.5.5 単項 - 演算子

注

単項 - 演算子は、そのオペランドを数値に変換してから符号を反転します。+0𝔽 の符号を反転すると -0𝔽 になり、-0𝔽 の符号を反転すると +0𝔽 になります。

13.5.5.1 Runtime Semantics: Evaluation

UnaryExpression : - UnaryExpression
  1. expr を UnaryExpression の ? Evaluation とする。
  2. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  3. oldValue が Number である場合、Number::unaryMinus(oldValue) を返す。
  4. 表明: oldValue は BigInt である。
  5. BigInt::unaryMinus(oldValue) を返す。

13.5.6 ビット単位 NOT 演算子 ( ~ )

13.5.6.1 Runtime Semantics: Evaluation

UnaryExpression : ~ UnaryExpression
  1. expr を UnaryExpression の ? Evaluation とする。
  2. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  3. oldValue が Number である場合、Number::bitwiseNOT(oldValue) を返す。
  4. 表明: oldValue は BigInt である。
  5. BigInt::bitwiseNOT(oldValue) を返す。

13.5.7 論理 NOT 演算子 ( ! )

13.5.7.1 Runtime Semantics: Evaluation

UnaryExpression : ! UnaryExpression
  1. expr を UnaryExpression の ? Evaluation とする。
  2. oldValue を ToBoolean(? GetValue(expr)) とする。
  3. oldValue が true である場合、false を返す。
  4. true を返す。

13.6 べき乗演算子

構文

ExponentiationExpression[Yield, Await] : UnaryExpression[?Yield, ?Await] UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await]

13.6.1 Runtime Semantics: Evaluation

ExponentiationExpression : UpdateExpression ** ExponentiationExpression
  1. ? EvaluateStringOrNumericBinaryExpression(UpdateExpression, **, ExponentiationExpression) を返す。

13.7 乗法演算子

構文

MultiplicativeExpression[Yield, Await] : ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await] MultiplicativeOperator : one of * / % 注
  • * 演算子は乗算を実行し、オペランドの積を生成します。
  • / 演算子は除算を実行し、オペランドの商を生成します。
  • % 演算子は、暗黙の除算によるオペランドの剰余を生成します。

13.7.1 Runtime Semantics: Evaluation

MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
  1. opText を MultiplicativeOperator に一致するソーステキストとする。
  2. ? EvaluateStringOrNumericBinaryExpression(MultiplicativeExpression, opText, ExponentiationExpression) を返す。

13.8 加法演算子

構文

AdditiveExpression[Yield, Await] : MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] + MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] - MultiplicativeExpression[?Yield, ?Await]

13.8.1 加算演算子 ( + )

注

加算演算子は、文字列連結または数値加算のいずれかを実行します。

13.8.1.1 Runtime Semantics: Evaluation

AdditiveExpression : AdditiveExpression + MultiplicativeExpression
  1. ? EvaluateStringOrNumericBinaryExpression(AdditiveExpression, +, MultiplicativeExpression) を返す。

13.8.2 減算演算子 ( - )

注

- 演算子は減算を実行し、オペランドの差を生成します。

13.8.2.1 Runtime Semantics: Evaluation

AdditiveExpression : AdditiveExpression - MultiplicativeExpression
  1. ? EvaluateStringOrNumericBinaryExpression(AdditiveExpression, -, MultiplicativeExpression) を返す。

13.9 ビットシフト演算子

構文

ShiftExpression[Yield, Await] : AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] << AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >> AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >>> AdditiveExpression[?Yield, ?Await]

13.9.1 左シフト演算子 ( << )

注

右オペランドで指定された量だけ、左オペランドに対してビット単位の左シフト操作を実行します。

13.9.1.1 Runtime Semantics: Evaluation

ShiftExpression : ShiftExpression << AdditiveExpression
  1. ? EvaluateStringOrNumericBinaryExpression(ShiftExpression, <<, AdditiveExpression) を返す。

13.9.2 符号付き右シフト演算子 ( >> )

注

右オペランドで指定された量だけ、左オペランドに対して符号ビットで埋めるビット単位の右シフト操作を実行します。

13.9.2.1 Runtime Semantics: Evaluation

ShiftExpression : ShiftExpression >> AdditiveExpression
  1. ? EvaluateStringOrNumericBinaryExpression(ShiftExpression, >>, AdditiveExpression) を返す。

13.9.3 符号なし右シフト演算子 ( >>> )

注

右オペランドで指定された量だけ、左オペランドに対してゼロで埋めるビット単位の右シフト操作を実行します。

13.9.3.1 Runtime Semantics: Evaluation

ShiftExpression : ShiftExpression >>> AdditiveExpression
  1. ? EvaluateStringOrNumericBinaryExpression(ShiftExpression, >>>, AdditiveExpression) を返す。

13.10 関係演算子

注 1

関係演算子を評価した結果は常に Boolean 型であり、その演算子が表す関係が2つのオペランド間で成立するかどうかを表します。

構文

RelationalExpression[In, Yield, Await] : ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] < ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] > ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] <= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] >= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] instanceof ShiftExpression[?Yield, ?Await] [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await] [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await] 注 2

[In] 文法パラメーターは、関係式内の in 演算子と for 文内の in 演算子の混同を避けるために必要です。

13.10.1 Runtime Semantics: Evaluation

RelationalExpression : RelationalExpression < ShiftExpression
  1. leftRef を RelationalExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を ShiftExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. result を ? IsLessThan(leftValue, rightValue, true) とする。
  6. result が undefined である場合、false を返す。
  7. result を返す。
RelationalExpression : RelationalExpression > ShiftExpression
  1. leftRef を RelationalExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を ShiftExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. result を ? IsLessThan(rightValue, leftValue, false) とする。
  6. result が undefined である場合、false を返す。
  7. result を返す。
RelationalExpression : RelationalExpression <= ShiftExpression
  1. leftRef を RelationalExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を ShiftExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. result を ? IsLessThan(rightValue, leftValue, false) とする。
  6. result が true または undefined のいずれかである場合、false を返す。
  7. true を返す。
RelationalExpression : RelationalExpression >= ShiftExpression
  1. leftRef を RelationalExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を ShiftExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. result を ? IsLessThan(leftValue, rightValue, true) とする。
  6. result が true または undefined のいずれかである場合、false を返す。
  7. true を返す。
RelationalExpression : RelationalExpression instanceof ShiftExpression
  1. leftRef を RelationalExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を ShiftExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. ? InstanceofOperator(leftValue, rightValue) を返す。
RelationalExpression : RelationalExpression in ShiftExpression
  1. leftRef を RelationalExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を ShiftExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. rightValue が Object でない場合、TypeError 例外をスローする。
  6. ? HasProperty(rightValue, ? ToPropertyKey(leftValue)) を返す。
RelationalExpression : PrivateIdentifier in ShiftExpression
  1. privateIdentifier を PrivateIdentifier の StringValue とする。
  2. rightRef を ShiftExpression の ? Evaluation とする。
  3. rightValue を ? GetValue(rightRef) とする。
  4. rightValue が Object でない場合、TypeError 例外をスローする。
  5. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  6. 表明: privateEnv は null ではない。
  7. privateName を ResolvePrivateIdentifier(privateEnv, privateIdentifier) とする。
  8. PrivateElementFind(rightValue, privateName) が empty である場合、false を返す。
  9. true を返す。

13.10.2 InstanceofOperator ( value, target )

抽象操作 InstanceofOperator。引数 value (ECMAScript 言語値) および target (ECMAScript 言語値)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 target の %Symbol.hasInstance% メソッドを調べるか、そのメソッドが存在しない場合は target の "prototype" プロパティの値が value のプロトタイプチェーン内に存在するかどうかを判定することにより、value が target のインスタンスであるかどうかを判定する汎用アルゴリズムを実装します。 呼び出されると、次の手順を実行する。

  1. target が Object でない場合、TypeError 例外をスローする。
  2. instOfHandler を ? GetMethod(target, %Symbol.hasInstance%) とする。
  3. instOfHandler が undefined でない場合、
    1. ToBoolean(? Call(instOfHandler, target, « value »)) を返す。
  4. IsCallable(target) が false である場合、TypeError 例外をスローする。
  5. ? OrdinaryHasInstance(target, value) を返す。
注

手順 4 および 5 は、instanceof 演算子の意味論を定義するために %Symbol.hasInstance% メソッドを使用していなかった以前の ECMAScript の版との互換性を提供します。オブジェクトが %Symbol.hasInstance% を定義も継承もしていない場合、既定の instanceof 意味論を使用します。

13.11 等価演算子

注

等価演算子を評価した結果は常に Boolean 型であり、その演算子が表す関係が2つのオペランド間で成立するかどうかを表します。

構文

EqualityExpression[In, Yield, Await] : RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] == RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] != RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] === RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] !== RelationalExpression[?In, ?Yield, ?Await]

13.11.1 Runtime Semantics: Evaluation

EqualityExpression : EqualityExpression == RelationalExpression
  1. leftRef を EqualityExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を RelationalExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. ? IsLooselyEqual(rightValue, leftValue) を返す。
EqualityExpression : EqualityExpression != RelationalExpression
  1. leftRef を EqualityExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を RelationalExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. result を ? IsLooselyEqual(rightValue, leftValue) とする。
  6. result が true である場合、false を返す。
  7. true を返す。
EqualityExpression : EqualityExpression === RelationalExpression
  1. leftRef を EqualityExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を RelationalExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. IsStrictlyEqual(rightValue, leftValue) を返す。
EqualityExpression : EqualityExpression !== RelationalExpression
  1. leftRef を EqualityExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を RelationalExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. result を IsStrictlyEqual(rightValue, leftValue) とする。
  6. result が true である場合、false を返す。
  7. true を返す。
注 1

等価演算子は、次の不変条件を維持します。

  • A != B は !(A == B) と等価です。
  • A == B は、A と B の評価順序を除き、B == A と等価です。
注 2

等価演算子は常に推移的であるとは限りません。たとえば、同じ String 値を表す2つの異なる String オブジェクトが存在する場合、それぞれの String オブジェクトは == 演算子によって String 値と等しいとみなされますが、2つの String オブジェクト同士は等しくありません。たとえば:

  • new String("a") == "a" と "a" == new String("a") はどちらも true です。
  • new String("a") == new String("a") は false です。
注 3

String の比較では、コード単位値の列に対する単純な等価性テストを使用します。Unicode 仕様で定義される、より複雑で意味論指向の文字または文字列の等価性や照合順序の定義を使用しようとはしません。したがって、Unicode Standard に従って正準的に等しい String 値でも、等しくないと判定される可能性があります。実質的に、このアルゴリズムは両方の String がすでに正規化形式であることを前提としています。

13.12 二項ビット演算子

構文

BitwiseANDExpression[In, Yield, Await] : EqualityExpression[?In, ?Yield, ?Await] BitwiseANDExpression[?In, ?Yield, ?Await] & EqualityExpression[?In, ?Yield, ?Await] BitwiseXORExpression[In, Yield, Await] : BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseXORExpression[?In, ?Yield, ?Await] ^ BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseORExpression[In, Yield, Await] : BitwiseXORExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] | BitwiseXORExpression[?In, ?Yield, ?Await]

13.12.1 Runtime Semantics: Evaluation

BitwiseANDExpression : BitwiseANDExpression & EqualityExpression
  1. ? EvaluateStringOrNumericBinaryExpression(BitwiseANDExpression, &, EqualityExpression) を返す。
BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression
  1. ? EvaluateStringOrNumericBinaryExpression(BitwiseXORExpression, ^, BitwiseANDExpression) を返す。
BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression
  1. ? EvaluateStringOrNumericBinaryExpression(BitwiseORExpression, |, BitwiseXORExpression) を返す。

13.13 二項論理演算子

構文

LogicalANDExpression[In, Yield, Await] : BitwiseORExpression[?In, ?Yield, ?Await] LogicalANDExpression[?In, ?Yield, ?Await] && BitwiseORExpression[?In, ?Yield, ?Await] LogicalORExpression[In, Yield, Await] : LogicalANDExpression[?In, ?Yield, ?Await] LogicalORExpression[?In, ?Yield, ?Await] || LogicalANDExpression[?In, ?Yield, ?Await] CoalesceExpression[In, Yield, Await] : CoalesceExpressionHead[?In, ?Yield, ?Await] ?? BitwiseORExpression[?In, ?Yield, ?Await] CoalesceExpressionHead[In, Yield, Await] : CoalesceExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] ShortCircuitExpression[In, Yield, Await] : LogicalORExpression[?In, ?Yield, ?Await] CoalesceExpression[?In, ?Yield, ?Await] 注

&& または || 演算子によって生成される値は、必ずしも Boolean 型ではありません。生成される値は常に2つのオペランド式のいずれかの値です。

13.13.1 Runtime Semantics: Evaluation

LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
  1. leftRef を LogicalANDExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. ToBoolean(leftValue) が false である場合、leftValue を返す。
  4. rightRef を BitwiseORExpression の ? Evaluation とする。
  5. ? GetValue(rightRef) を返す。
LogicalORExpression : LogicalORExpression || LogicalANDExpression
  1. leftRef を LogicalORExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. ToBoolean(leftValue) が true である場合、leftValue を返す。
  4. rightRef を LogicalANDExpression の ? Evaluation とする。
  5. ? GetValue(rightRef) を返す。
CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression
  1. leftRef を CoalesceExpressionHead の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. leftValue が undefined でも null でもない場合、leftValue を返す。
  4. rightRef を BitwiseORExpression の ? Evaluation とする。
  5. ? GetValue(rightRef) を返す。

13.14 条件演算子 ( ? : )

構文

ConditionalExpression[In, Yield, Await] : ShortCircuitExpression[?In, ?Yield, ?Await] ShortCircuitExpression[?In, ?Yield, ?Await] ? AssignmentExpression[+In, ?Yield, ?Await] : AssignmentExpression[?In, ?Yield, ?Await] 注

ECMAScript の ConditionalExpression の文法は C および Java のものとわずかに異なります。C と Java では、第2部分式に Expression を許可しますが、第3式を ConditionalExpression に制限します。ECMAScript でこの違いを設けた理由は、条件のどちらの分岐でも代入式を使用できるようにし、中央の式としてコンマ式を使用するという混乱を招き、ほとんど役に立たない場合を排除するためです。

13.14.1 Runtime Semantics: Evaluation

ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
  1. leftRef を ShortCircuitExpression の ? Evaluation とする。
  2. leftValue を ToBoolean(? GetValue(leftRef)) とする。
  3. leftValue が true である場合、
    1. trueRef を最初の AssignmentExpression の ? Evaluation とする。
    2. ? GetValue(trueRef) を返す。
  4. falseRef を2番目の AssignmentExpression の ? Evaluation とする。
  5. ? GetValue(falseRef) を返す。

13.15 代入演算子

構文

AssignmentExpression[In, Yield, Await] : ConditionalExpression[?In, ?Yield, ?Await] [+Yield] YieldExpression[?In, ?Await] ArrowFunction[?In, ?Yield, ?Await] AsyncArrowFunction[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] &&= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ||= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ??= AssignmentExpression[?In, ?Yield, ?Await] AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=

13.15.1 Static Semantics: 早期エラー

AssignmentExpression : LeftHandSideExpression = AssignmentExpression AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression

13.15.2 Runtime Semantics: Evaluation

AssignmentExpression : LeftHandSideExpression = AssignmentExpression
  1. LeftHandSideExpression が ObjectLiteral と ArrayLiteral のいずれでもない場合、
    1. leftRef を LeftHandSideExpression の ? Evaluation とする。
    2. LeftHandSideExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。
    3. IsAnonymousFunctionDefinition(AssignmentExpression) が true であり、LeftHandSideExpression の IsIdentifierRef が true である場合、
      1. lhs を LeftHandSideExpression の StringValue とする。
      2. rightValue を、引数 lhs を指定した AssignmentExpression の ? NamedEvaluation とする。
    4. そうでない場合、
      1. rightRef を AssignmentExpression の ? Evaluation とする。
      2. rightValue を ? GetValue(rightRef) とする。
    5. ? PutValue(leftRef, rightValue) を実行する。
    6. rightValue を返す。
  2. assignmentPattern を LeftHandSideExpression によって被覆される AssignmentPattern とする。
  3. rightRef を AssignmentExpression の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. 引数 rightValue を指定した assignmentPattern の ? DestructuringAssignmentEvaluation を実行する。
  6. rightValue を返す。
AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression
  1. leftRef を LeftHandSideExpression の ? Evaluation とする。
  2. LeftHandSideExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。
  3. leftValue を ? GetValue(leftRef) とする。
  4. rightRef を AssignmentExpression の ? Evaluation とする。
  5. rightValue を ? GetValue(rightRef) とする。
  6. assignmentOpText を AssignmentOperator に一致するソーステキストとする。
  7. opText を、次の表で assignmentOpText に関連付けられた Unicode コードポイント列とする。
    assignmentOpText opText
    **= **
    *= *
    /= /
    %= %
    += +
    -= -
    <<= <<
    >>= >>
    >>>= >>>
    &= &
    ^= ^
    |= |
  8. result を ? ApplyStringOrNumericBinaryOperator(leftValue, opText, rightValue) とする。
  9. ? PutValue(leftRef, result) を実行する。
  10. result を返す。
AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression
  1. leftRef を LeftHandSideExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. ToBoolean(leftValue) が false である場合、leftValue を返す。
  4. IsAnonymousFunctionDefinition(AssignmentExpression) が true であり、LeftHandSideExpression の IsIdentifierRef が true である場合、
    1. lhs を LeftHandSideExpression の StringValue とする。
    2. rightValue を、引数 lhs を指定した AssignmentExpression の ? NamedEvaluation とする。
  5. そうでない場合、
    1. rightRef を AssignmentExpression の ? Evaluation とする。
    2. rightValue を ? GetValue(rightRef) とする。
  6. ? PutValue(leftRef, rightValue) を実行する。
  7. rightValue を返す。
AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression
  1. leftRef を LeftHandSideExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. ToBoolean(leftValue) が true である場合、leftValue を返す。
  4. IsAnonymousFunctionDefinition(AssignmentExpression) が true であり、LeftHandSideExpression の IsIdentifierRef が true である場合、
    1. lhs を LeftHandSideExpression の StringValue とする。
    2. rightValue を、引数 lhs を指定した AssignmentExpression の ? NamedEvaluation とする。
  5. そうでない場合、
    1. rightRef を AssignmentExpression の ? Evaluation とする。
    2. rightValue を ? GetValue(rightRef) とする。
  6. ? PutValue(leftRef, rightValue) を実行する。
  7. rightValue を返す。
AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression
  1. leftRef を LeftHandSideExpression の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. leftValue が undefined でも null でもない場合、leftValue を返す。
  4. IsAnonymousFunctionDefinition(AssignmentExpression) が true であり、LeftHandSideExpression の IsIdentifierRef が true である場合、
    1. lhs を LeftHandSideExpression の StringValue とする。
    2. rightValue を、引数 lhs を指定した AssignmentExpression の ? NamedEvaluation とする。
  5. そうでない場合、
    1. rightRef を AssignmentExpression の ? Evaluation とする。
    2. rightValue を ? GetValue(rightRef) とする。
  6. ? PutValue(leftRef, rightValue) を実行する。
  7. rightValue を返す。
注

この式が strict モードコード内に現れる場合、手順 1.e、3、2、2、2 の leftRef が解決不能参照であれば実行時エラーです。その場合、ReferenceError 例外がスローされます。さらに、手順 9、6、6、6 の leftRef が、属性値 { [[Writable]]: false } を持つデータプロパティ、属性値 { [[Setter]]: undefined } を持つアクセサープロパティ、または IsExtensible 述語が false を返すオブジェクトの存在しないプロパティへの参照である場合も実行時エラーです。これらの場合、TypeError 例外がスローされます。

13.15.3 ApplyStringOrNumericBinaryOperator ( leftValue, opText, rightValue )

抽象操作 ApplyStringOrNumericBinaryOperator。引数 leftValue (ECMAScript 言語値)、opText ((**、*、/、%、+、-、<<、>>、>>>、&、^ または |)) および rightValue (ECMAScript 言語値)。戻り値:(正常完了 (値:(String、BigInt または Number)) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. opText が + である場合、
    1. leftPrimitive を ? ToPrimitive(leftValue) とする。
    2. rightPrimitive を ? ToPrimitive(rightValue) とする。
    3. leftPrimitive が String であるか、rightPrimitive が String である場合、
      1. leftString を ? ToString(leftPrimitive) とする。
      2. rightString を ? ToString(rightPrimitive) とする。
      3. leftString と rightString の文字列連結を返す。
    4. leftValue を leftPrimitive に設定する。
    5. rightValue を rightPrimitive に設定する。
  2. 注記: この時点では、数値演算でなければならない。
  3. leftNumber を ? ToNumeric(leftValue) とする。
  4. rightNumber を ? ToNumeric(rightValue) とする。
  5. SameType(leftNumber, rightNumber) が false である場合、TypeError 例外をスローする。
  6. leftNumber が BigInt である場合、
    1. opText が ** である場合、? BigInt::exponentiate(leftNumber, rightNumber) を返す。
    2. opText が / である場合、? BigInt::divide(leftNumber, rightNumber) を返す。
    3. opText が % である場合、? BigInt::remainder(leftNumber, rightNumber) を返す。
    4. opText が >>> である場合、? BigInt::unsignedRightShift(leftNumber, rightNumber) を返す。
    5. operation を、次の表で opText に関連付けられた抽象操作とする。
      opText operation
      * BigInt::multiply
      + BigInt::add
      - BigInt::subtract
      << BigInt::leftShift
      >> BigInt::signedRightShift
      & BigInt::bitwiseAND
      ^ BigInt::bitwiseXOR
      | BigInt::bitwiseOR
  7. そうでない場合、
    1. 表明: leftNumber は Number である。
    2. operation を、次の表で opText に関連付けられた抽象操作とする。
      opText operation
      ** Number::exponentiate
      * Number::multiply
      / Number::divide
      % Number::remainder
      + Number::add
      - Number::subtract
      << Number::leftShift
      >> Number::signedRightShift
      >>> Number::unsignedRightShift
      & Number::bitwiseAND
      ^ Number::bitwiseXOR
      | Number::bitwiseOR
  8. operation(leftNumber, rightNumber) を返す。
注 1

手順 1.a および 1.b の ToPrimitive 呼出しにはヒントが与えられません。Date を除くすべての標準オブジェクトは、ヒントがない場合を number が与えられた場合と同様に処理します。Date はヒントがない場合を string が与えられた場合と同様に処理します。特殊オブジェクトはヒントがない場合を別の方法で処理してもかまいません。

注 2

手順 1.c は、論理積演算ではなく論理和演算を使用する点で、IsLessThan アルゴリズムの手順 3 と異なります。

13.15.4 EvaluateStringOrNumericBinaryExpression ( leftOperand, opText, rightOperand )

抽象操作 EvaluateStringOrNumericBinaryExpression。引数 leftOperand (構文解析ノード)、opText ((**、*、/、%、+、-、<<、>>、>>>、&、^ または |)) および rightOperand (構文解析ノード)。戻り値:(正常完了 (値:(String、BigInt または Number)) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. leftRef を leftOperand の ? Evaluation とする。
  2. leftValue を ? GetValue(leftRef) とする。
  3. rightRef を rightOperand の ? Evaluation とする。
  4. rightValue を ? GetValue(rightRef) とする。
  5. ? ApplyStringOrNumericBinaryOperator(leftValue, opText, rightValue) を返す。

13.15.5 分割代入

補助構文

特定の状況で次の生成規則のインスタンスを処理するとき
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression の解釈は、次の文法を使用して詳細化されます。

AssignmentPattern[Yield, Await] : ObjectAssignmentPattern[?Yield, ?Await] ArrayAssignmentPattern[?Yield, ?Await] ObjectAssignmentPattern[Yield, Await] : { } { AssignmentRestProperty[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] ,opt } { AssignmentPropertyList[?Yield, ?Await] , AssignmentRestProperty[?Yield, ?Await] } ArrayAssignmentPattern[Yield, Await] : [ Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] [ AssignmentElementList[?Yield, ?Await] ] [ AssignmentElementList[?Yield, ?Await] , Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] AssignmentRestProperty[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] AssignmentPropertyList[Yield, Await] : AssignmentProperty[?Yield, ?Await] AssignmentPropertyList[?Yield, ?Await] , AssignmentProperty[?Yield, ?Await] AssignmentElementList[Yield, Await] : AssignmentElisionElement[?Yield, ?Await] AssignmentElementList[?Yield, ?Await] , AssignmentElisionElement[?Yield, ?Await] AssignmentElisionElement[Yield, Await] : Elisionopt AssignmentElement[?Yield, ?Await] AssignmentProperty[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt PropertyName[?Yield, ?Await] : AssignmentElement[?Yield, ?Await] AssignmentElement[Yield, Await] : DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt AssignmentRestElement[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] DestructuringAssignmentTarget[Yield, Await] : LeftHandSideExpression[?Yield, ?Await]

13.15.5.1 Static Semantics: 早期エラー

AssignmentProperty : IdentifierReference Initializeropt AssignmentRestProperty : ... DestructuringAssignmentTarget DestructuringAssignmentTarget : LeftHandSideExpression

13.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation

構文指向操作 DestructuringAssignmentEvaluation。引数 value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または 中途完了)。 次の生成規則ごとに定義される。

ObjectAssignmentPattern : { }
  1. ? RequireObjectCoercible(value) を実行する。
  2. unused を返す。
ObjectAssignmentPattern : { AssignmentPropertyList ,opt }
  1. ? RequireObjectCoercible(value) を実行する。
  2. 引数 value を指定した AssignmentPropertyList の ? PropertyDestructuringAssignmentEvaluation を実行する。
  3. unused を返す。
ObjectAssignmentPattern : { AssignmentRestProperty }
  1. ? RequireObjectCoercible(value) を実行する。
  2. excludedNames を新しい空の List とする。
  3. 引数 value および excludedNames を指定した AssignmentRestProperty の ? RestDestructuringAssignmentEvaluation を返す。
ObjectAssignmentPattern : { AssignmentPropertyList , AssignmentRestProperty }
  1. ? RequireObjectCoercible(value) を実行する。
  2. excludedNames を、引数 value を指定した AssignmentPropertyList の ? PropertyDestructuringAssignmentEvaluation とする。
  3. 引数 value および excludedNames を指定した AssignmentRestProperty の ? RestDestructuringAssignmentEvaluation を返す。
ArrayAssignmentPattern : [ ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. ? IteratorClose(iteratorRecord, NormalCompletion(unused)) を返す。
ArrayAssignmentPattern : [ Elision ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. result を、引数 iteratorRecord を指定した Elision の IteratorDestructuringAssignmentEvaluation の Completion とする。
  3. iteratorRecord.[[Done]] が false である場合、? IteratorClose(iteratorRecord, result) を返す。
  4. result を返す。
ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. Elision が存在する場合、
    1. status を、引数 iteratorRecord を指定した Elision の IteratorDestructuringAssignmentEvaluation の Completion とする。
    2. status が中断完了である場合、
      1. 表明: iteratorRecord.[[Done]] は true である。
      2. ? status を返す。
  3. result を、引数 iteratorRecord を指定した AssignmentRestElement の IteratorDestructuringAssignmentEvaluation の Completion とする。
  4. iteratorRecord.[[Done]] が false である場合、? IteratorClose(iteratorRecord, result) を返す。
  5. result を返す。
ArrayAssignmentPattern : [ AssignmentElementList ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. result を、引数 iteratorRecord を指定した AssignmentElementList の IteratorDestructuringAssignmentEvaluation の Completion とする。
  3. iteratorRecord.[[Done]] が false である場合、? IteratorClose(iteratorRecord, result) を返す。
  4. result を返す。
ArrayAssignmentPattern : [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. status を、引数 iteratorRecord を指定した AssignmentElementList の IteratorDestructuringAssignmentEvaluation の Completion とする。
  3. status が中断完了である場合、
    1. iteratorRecord.[[Done]] が false である場合、? IteratorClose(iteratorRecord, status) を返す。
    2. ? status を返す。
  4. Elision が存在する場合、
    1. status を、引数 iteratorRecord を指定した Elision の IteratorDestructuringAssignmentEvaluation の Completion に設定する。
    2. status が中断完了である場合、
      1. 表明: iteratorRecord.[[Done]] は true である。
      2. ? status を返す。
  5. AssignmentRestElement が存在する場合、
    1. status を、引数 iteratorRecord を指定した AssignmentRestElement の IteratorDestructuringAssignmentEvaluation の Completion に設定する。
  6. iteratorRecord.[[Done]] が false である場合、? IteratorClose(iteratorRecord, status) を返す。
  7. ? status を返す。

13.15.5.3 Runtime Semantics: PropertyDestructuringAssignmentEvaluation

構文指向操作 PropertyDestructuringAssignmentEvaluation。引数 value (ECMAScript 言語値)。戻り値:(正常完了 (値:リスト (要素:プロパティキー)) または 中途完了)。 分割代入されたすべてのプロパティキーのリストを収集します。 次の生成規則ごとに定義される。

AssignmentPropertyList : AssignmentPropertyList , AssignmentProperty
  1. propertyNames を、引数 value を指定した AssignmentPropertyList の ? PropertyDestructuringAssignmentEvaluation とする。
  2. nextNames を、引数 value を指定した AssignmentProperty の ? PropertyDestructuringAssignmentEvaluation とする。
  3. propertyNames と nextNames のリスト連結を返す。
AssignmentProperty : IdentifierReference Initializeropt
  1. propertyName を IdentifierReference の StringValue とする。
  2. leftRef を ? ResolveBinding(propertyName) とする。
  3. value を ? GetV(value, propertyName) に設定する。
  4. Initializer が存在し、value が undefined である場合、
    1. IsAnonymousFunctionDefinition(Initializer) が true である場合、
      1. value を、引数 propertyName を指定した Initializer の ? NamedEvaluation に設定する。
    2. そうでない場合、
      1. defaultValue を Initializer の ? Evaluation とする。
      2. value を ? GetValue(defaultValue) に設定する。
  5. ? PutValue(leftRef, value) を実行する。
  6. « propertyName » を返す。
AssignmentProperty : PropertyName : AssignmentElement
  1. name を PropertyName の ? Evaluation とする。
  2. 引数 value および name を指定した AssignmentElement の ? KeyedDestructuringAssignmentEvaluation を実行する。
  3. « name » を返す。

13.15.5.4 Runtime Semantics: RestDestructuringAssignmentEvaluation

構文指向操作 RestDestructuringAssignmentEvaluation。引数 value (ECMAScript 言語値) および excludedNames (リスト (要素:プロパティキー))。戻り値:(正常完了 (値:unused) または 中途完了)。 次の生成規則ごとに定義される。

AssignmentRestProperty : ... DestructuringAssignmentTarget
  1. leftRef を DestructuringAssignmentTarget の ? Evaluation とする。
  2. restObj を OrdinaryObjectCreate(%Object.prototype%) とする。
  3. ? CopyDataProperties(restObj, value, excludedNames) を実行する。
  4. ? PutValue(leftRef, restObj) を返す。

13.15.5.5 Runtime Semantics: IteratorDestructuringAssignmentEvaluation

構文指向操作 IteratorDestructuringAssignmentEvaluation。引数 iteratorRecord (Iteratorレコード)。戻り値:(正常完了 (値:unused) または 中途完了)。 次の生成規則ごとに定義される。

AssignmentElementList : AssignmentElisionElement
  1. 引数 iteratorRecord を指定した AssignmentElisionElement の ? IteratorDestructuringAssignmentEvaluation を返す。
AssignmentElementList : AssignmentElementList , AssignmentElisionElement
  1. 引数 iteratorRecord を指定した AssignmentElementList の ? IteratorDestructuringAssignmentEvaluation を実行する。
  2. 引数 iteratorRecord を指定した AssignmentElisionElement の ? IteratorDestructuringAssignmentEvaluation を返す。
AssignmentElisionElement : AssignmentElement
  1. 引数 iteratorRecord を指定した AssignmentElement の ? IteratorDestructuringAssignmentEvaluation を返す。
AssignmentElisionElement : Elision AssignmentElement
  1. 引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を実行する。
  2. 引数 iteratorRecord を指定した AssignmentElement の ? IteratorDestructuringAssignmentEvaluation を返す。
Elision : ,
  1. iteratorRecord.[[Done]] が false である場合、
    1. ? IteratorStep(iteratorRecord) を実行する。
  2. unused を返す。
Elision : Elision ,
  1. 引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を実行する。
  2. iteratorRecord.[[Done]] が false である場合、
    1. ? IteratorStep(iteratorRecord) を実行する。
  3. unused を返す。
AssignmentElement : DestructuringAssignmentTarget Initializeropt
  1. DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral のいずれでもない場合、
    1. leftRef を DestructuringAssignmentTarget の ? Evaluation とする。
  2. value を undefined とする。
  3. iteratorRecord.[[Done]] が false である場合、
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done でない場合、
      1. value を next に設定する。
  4. Initializer が存在し、value が undefined である場合、
    1. IsAnonymousFunctionDefinition(Initializer) が true であり、DestructuringAssignmentTarget の IsIdentifierRef が true である場合、
      1. target を DestructuringAssignmentTarget の StringValue とする。
      2. value を、引数 target を指定した Initializer の ? NamedEvaluation に設定する。
    2. そうでない場合、
      1. defaultValue を Initializer の ? Evaluation とする。
      2. value を ? GetValue(defaultValue) に設定する。
  5. DestructuringAssignmentTarget が ObjectLiteral または ArrayLiteral のいずれかである場合、
    1. nestedAssignmentPattern を DestructuringAssignmentTarget によって被覆される AssignmentPattern とする。
    2. 引数 value を指定した nestedAssignmentPattern の ? DestructuringAssignmentEvaluation を返す。
  6. ? PutValue(leftRef, value) を返す。
注

分割パターンではない DestructuringAssignmentTarget を、イテレーターへのアクセスや Initializer の評価より前に評価することによって、左から右への評価順序が維持されます。

AssignmentRestElement : ... DestructuringAssignmentTarget
  1. DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral のいずれでもない場合、
    1. leftRef を DestructuringAssignmentTarget の ? Evaluation とする。
  2. array を ! ArrayCreate(0) とする。
  3. n を 0 とする。
  4. iteratorRecord.[[Done]] が false の間、次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done でない場合、
      1. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), next) を実行する。
      2. n を n + 1 に設定する。
  5. DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral のいずれでもない場合、
    1. ? PutValue(leftRef, array) を返す。
  6. nestedAssignmentPattern を DestructuringAssignmentTarget によって被覆される AssignmentPattern とする。
  7. 引数 array を指定した nestedAssignmentPattern の ? DestructuringAssignmentEvaluation を返す。

13.15.5.6 Runtime Semantics: KeyedDestructuringAssignmentEvaluation

構文指向操作 KeyedDestructuringAssignmentEvaluation。引数 value (ECMAScript 言語値) および propertyName (プロパティキー)。戻り値:(正常完了 (値:unused) または 中途完了)。 次の生成規則ごとに定義される。

AssignmentElement : DestructuringAssignmentTarget Initializeropt
  1. DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral のいずれでもない場合、
    1. leftRef を DestructuringAssignmentTarget の ? Evaluation とする。
  2. value を ? GetV(value, propertyName) に設定する。
  3. Initializer が存在し、value が undefined である場合、
    1. IsAnonymousFunctionDefinition(Initializer) が true であり、DestructuringAssignmentTarget の IsIdentifierRef が true である場合、
      1. target を DestructuringAssignmentTarget の StringValue とする。
      2. rhsValue を、引数 target を指定した Initializer の ? NamedEvaluation とする。
    2. そうでない場合、
      1. defaultValue を Initializer の ? Evaluation とする。
      2. rhsValue を ? GetValue(defaultValue) とする。
  4. そうでない場合、
    1. rhsValue を value とする。
  5. DestructuringAssignmentTarget が ObjectLiteral または ArrayLiteral のいずれかである場合、
    1. assignmentPattern を DestructuringAssignmentTarget によって被覆される AssignmentPattern とする。
    2. 引数 rhsValue を指定した assignmentPattern の ? DestructuringAssignmentEvaluation を返す。
  6. ? PutValue(leftRef, rhsValue) を返す。

13.16 コンマ演算子 ( , )

構文

Expression[In, Yield, Await] : AssignmentExpression[?In, ?Yield, ?Await] Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]

13.16.1 Runtime Semantics: Evaluation

Expression : Expression , AssignmentExpression
  1. leftRef を Expression の ? Evaluation とする。
  2. ? GetValue(leftRef) を実行する。
  3. rightRef を AssignmentExpression の ? Evaluation とする。
  4. ? GetValue(rightRef) を返す。
注

GetValue の値は使用されませんが、観測可能な副作用を持つ可能性があるため、GetValue を呼び出さなければなりません。