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

12.1 識別子(Identifiers)

構文:

IdentifierReference[Yield, Await] :
Identifier
[~Yield]yield
[~Await]await
BindingIdentifier[Yield, Await] :
Identifier
yield
await
LabelIdentifier[Yield, Await] :
Identifier
[~Yield]yield
[~Await]await
yieldawait は文法で BindingIdentifier として許可され、以降の項の静的セマンティクスでは禁止されており、次のようなときに自動セミコロン挿入を禁止します。

let
await 0;

12.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

  • このプロダクションに一致するコードがstrictモードコードに含まれ、IdentifierStringValue"eval"または"arguments"である場合、構文エラーです。
LabelIdentifier : yield
  • このプロダクションと一致するコードがstrictモードコードに含まれている場合、構文エラーです。
LabelIdentifier : await
BindingIdentifier[Yield, Await] : yield
  • このプロダクションに[Yield]パラメータがある場合、構文エラーです。
BindingIdentifier[Yield, Await] : await
  • このプロダクションに[Await]パラメータがある場合、構文エラーです。
BindingIdentifier[Yield, Await] : Identifier
LabelIdentifier[Yield, Await] : Identifier
  • このプロダクションに[Yield]パラメータがあり、IdentifierStringValue"yield" の場合は、構文エラーです。
  • このプロダクションに[Await]パラメータがあり、IdentifierStringValue"await" の場合は、構文エラーです。
  • このフレーズがstrictモードコードに含まれ、IdentifierNameStringValue"implements""interface""let""package""private""protected""public""static""yield" の場合は、構文エラーです。
  • 構文文法のゴールシンボルModuleで、IdentifierNameStringValue"await"の場合は、構文エラーです。
  • IdentifierName
    StringValueが、"yield"または"await"を除いて、ReservedWordStringValueと同じ値である場合は、構文エラーです。
IdentifierNameStringValueは、IdentifierNameのUnicodeエスケープシーケンスを正規化します。そのためエスケープを使用して、コードポイントシーケンスがReservedWordと同じであるIdentifierを書き込むことはできません。

12.1.2 静的セマンティクス(Static Semantics):BoundNames

  1. IdentifierStringValueを含む新しいリストを返す
  1. "yield"を含む新しいリストを返す
  1. "await"を含む新しいリストを返す

12.1.3 静的セマンティクス(Static Semantics):AssignmentTargetType

  1. IdentifierReferencestrictモードコードに含まれていて、IdentifierStringValue"eval"または"arguments"の場合、invalidを返す。
  2. simpleを返す
  1. simpleを返す
  1. simpleを返す

12.1.4 静的セマンティクス(Static Semantics):StringValue

LabelIdentifier : yield
  1. "yield"を返す
LabelIdentifier : await
  1. "await"を返す
  1. IdentifierNameStringValueを返す

12.1.5 ランタイムセマンティクス(Runtime Semantics):BindingInitialization

パラメータvalueenvironmentを使用します。

environmentがundefinedのとき、PutValueで初期化値を割り当てる必要があります。 これは、一部の非strict関数varステートメントと仮パラメーターリストの場合です(9.2.10を参照)。 これらの場合、レキシカルバインディングはその初期化子の評価前に巻き上げられ、事前に初期化されます。
  1. IdentifierStringValuename とする
  2. ? InitializeBoundName(name, value, environment)を返す
  1. ? InitializeBoundName("yield", value, environment)を返す
  1. ? InitializeBoundName("await", value, environment)を返す

12.1.5.1 ランタイムセマンティクス(Runtime Semantics): InitializeBoundName ( name, value, environment )

  1. Assert: Type(name) は String型
  2. environmentundefined でないなら、
    1. environment の EnvironmentRecordenv とする
    2. env.InitializeBinding(name, value)を実行
    3. NormalCompletion(undefined)を返す
  3. Else,
    1. ResolveBinding(name) を lhs とする
    2. ? PutValue(lhs, value)を返す

12.1.6 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ? ResolveBinding(IdentifierStringValue )を返す
  1. ? ResolveBinding( "yield" )を返す
  1. ? ResolveBinding( "await" )を返す
IdentifierReferenceの評価結果は、常にReference型の値です。
非strictコードでは、キーワードyieldを識別子として使用できます。 IdentifierReferenceを評価すると、Identifierであるかのように、yieldのバインディングが解決されます。 早期エラー制限により、このような評価が非strictコードに対してのみ発生することが保証されます。

12.2 一次式(Primary Expression)

構文:

CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] :
(Expression[+In, ?Yield, ?Await] )
(Expression[+In, ?Yield, ?Await] ,)
()
(...BindingIdentifier[?Yield, ?Await] )
(...BindingPattern[?Yield, ?Await] )
(Expression[+In, ?Yield, ?Await] ,...BindingIdentifier[?Yield, ?Await] )
(Expression[+In, ?Yield, ?Await] ,...BindingPattern[?Yield, ?Await] )

補足構文:

次のプロダクションのインスタンスを処理するとき

CoverParenthesizedExpressionAndArrowParameterListの解釈は、次の文法を使用して改善されます。

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

12.2.1 セマンティクス(Semantics)

12.2.1.1 静的セマンティクス(Static Semantics): CoveredParenthesizedExpression

12.2.1.2 静的セマンティクス(Static Semantics): HasName

  1. CoverParenthesizedExpressionAndArrowParameterListCoveredParenthesizedExpressionexpr とする
  2. exprIsFunctionDefinitionfalse なら、 false を返す
  3. expr の HasName を返す

12.2.1.3 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す
  1. CoverParenthesizedExpressionAndArrowParameterListCoveredParenthesizedExpression を expr とする
  2. exprIsFunctionDefinition を返す

12.2.1.4 静的セマンティクス(Static Semantics): IsIdentifierRef

  1. true を返す
  1. false を返す

12.2.1.5 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す
  1. CoverParenthesizedExpressionAndArrowParameterList の CoveredParenthesizedExpressionexpr とする
  2. exprAssignmentTargetType を返す

12.2.2 thisキーワード(The this Keyword)

12.2.2.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ? ResolveThisBinding ()を返す

12.2.3 識別子参照(Identifier Reference)

IdentifierReferenceについては、12.1を参照

12.2.4 リテラル(Literals)

構文:

12.2.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. null を返す
  1. BooleanLiteralfalseトークンなら、 false を返す
  2. BooleanLiteraltrueトークンなら、 true を返す
  1. 11.8.3で定義されているNumericLiteralNumericValueを返す
  1. 11.8.4.1で定義されているStringLiteralStringValueを返す

12.2.5 配列初期化子(Array Initializer)

ArrayLiteralは、配列要素を表す0個以上の式を角括弧で囲んだリストを使用して、Arrayオブジェクトの初期化をおこなう式です。 要素はリテラルである必要はありません。 配列初期化子はその都度評価されます。

配列要素は、要素リストの最初、中間、最後を省略できます。 要素リストのカンマの前にAssignmentExpression(つまり、最初または別のカンマの後にあるカンマ)がない場合は、欠落している配列要素が配列の長さに影響し、後続要素のインデックスが増加させます。 省略された配列要素は定義されていません。 要素が配列の最後で省略されている場合、その要素は配列の長さに影響しません。

構文:

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]
SpreadElement[Yield, Await]:
...AssignmentExpression[+In, ?Yield, ?Await]

12.2.5.1 ランタイムセマンティクス(Runtime Semantics): ArrayAccumulation

パラメータ array nextIndexを使用します。

Elision : ,
  1. nextIndex + 1len とする
  2. ? Set(array, "length", len, true)を実行
  3. NOTE: 上のSetは、len が 232-1 をこえるとき、例外が発生する
  4. len を返す
  1. 引数 arraynextIndex + 1 を使用して ElisionArrayAccumulationを実行した結果を返す
  1. Elision が存在するなら、
    1. 引数 arraynextIndex を使用して ElisionArrayAccumulationを実行した結果 を nextIndex にセットする
    2. ReturnIfAbrupt(nextIndex)
  2. AssignmentExpression の評価結果 を initResult とする
  3. ? GetValue(initResult) を initValue とする
  4. ! CreateDataPropertyOrThrow(array, ! ToString(nextIndex), initValue) を created とする
  5. nextIndex + 1 を返す
  1. Elision が存在するなら、
    1. 引数 arraynextIndex を使用してElisionArrayAccumulationを実行した結果 を nextIndex にセットする
    2. ReturnIfAbrupt(nextIndex)
  2. 引数 arraynextIndex を使用して SpreadElementArrayAccumulation を実行した結果を返す
  1. 引数 arraynextIndex を使用してElementListArrayAccumulationを実行した結果 を nextIndex にセットする
  2. ReturnIfAbrupt(nextIndex)
  3. Elision が存在するなら、
    1. 引数 arraynextIndex を使用してElisionArrayAccumulationを実行した結果 を nextIndex にセットする
    2. ReturnIfAbrupt(nextIndex)
  4. AssignmentExpressionの評価結果 を initResult とする
  5. ? GetValue(initResult) を initValue とする
  6. ! CreateDataPropertyOrThrow(array, !ToString(nextIndex), initValue) を created とする
  7. nextIndex + 1を返す
  1. 引数 arraynextIndex を使用してElementListArrayAccumulationを実行した結果を nextIndex にセットする
  2. ReturnIfAbrupt(nextIndex)
  3. Elision が存在するなら、
    1. 引数arraynextIndexを使用してElisionArrayAccumulationを実行した結果 を nextIndex にセットする
    2. ReturnIfAbrupt(nextIndex)
  4. 引数 arraynextIndex を使用して SpreadElementArrayAccumulation を実行した結果を返す
  1. AssignmentExpression の評価結果 を spreadRef とする
  2. ? GetValue(spreadRef) を spreadObj とする
  3. ? GetIterator(spreadObj) を iteratorRecord とする
  4. 以下を繰り返す
    1. ? IteratorStep(iteratorRecord) を next とする
    2. nextfalse なら、nextIndex を返す
    3. ? IteratorValue(next) を nextValue とする
    4. ! CreateDataPropertyOrThrow(array, !ToString(nextIndex), nextValue)を実行
    5. nextIndex + 1nextIndex にセット
[[Set]]を使用して新しい独自プロパティを作成できないように標準組み込みArrayプロトタイプオブジェクトが変更されている場合でも、独自プロパティが配列に定義できるようにするためにCreateDataPropertyOrThrowが使用されます。

12.2.5.2 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ! ArrayCreate(0) を array とする
  2. Elision が存在するなら、
    1. 引数 array0 を使用して ElisionArrayAccumulation を実行した結果を len とする
    2. ReturnIfAbrupt(len)
  3. arrayを返す
  1. ! ArrayCreate(0) を array とする
  2. 引数 array0 を使用して ElementList のt ArrayAccumulation を実行した結果を len とする
  3. ReturnIfAbrupt(len)
  4. arrayを返す
  1. ! ArrayCreate(0) を array とする
  2. 引数 array0 を使用して ElementListArrayAccumulation を実行した結果を nextIndex とする
  3. ReturnIfAbrupt(nextIndex)
  4. Elision が存在するなら、
    1. 引数 arraynextIndex を使用して ElisionArrayAccumulation を実行した結果 を len とする
    2. ReturnIfAbrupt(len)
  5. arrayを返す

12.2.6 オブジェクト初期化子(Object Initializer)

オブジェクト初期化子は、オブジェクトの初期化をリテラルに似た形式で指示する式です。 これは、中括弧で囲まれた、プロパティキーと関連する値のゼロ個以上のペアのリストです。 値はリテラルである必要はありません。 オブジェクト初期化子はその都度評価されます。

構文:

ObjectLiteral[Yield, Await] :
{}
{PropertyDefinitionList[?Yield, ?Await] }
{PropertyDefinitionList[?Yield, ?Await] ,}
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]
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]
MethodDefinition については、 14.3参照
特定のコンテキストでは、ObjectLiteralは、より制限された二次文法のカバー文法として使用されます。 CoverInitializedNameプロダクションは、これらの二次文法を完全にカバーするために必要です。 ただし、このプロダクションを使用すると、実際のObjectLiteralが予想される通常のコンテキストで初期の構文エラーが発生します。

12.2.6.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

  • MethodDefinitionのHasDirectSuperがtrueの場合は、構文エラーです。

ObjectLiteralプロダクションはObjectAssignmentPatternのカバー文法としても使用され、CoverParenthesizedExpressionAndArrowParameterListの一部として認識される場合があります。 ObjectLiteralObjectAssignmentPatternを必要とするコンテキストで表示される場合、以下の早期エラールールは適用されません。 さらに、CoverParenthesizedExpressionAndArrowParameterListまたはCoverCallExpressionAndAsyncArrowHeadの最初の解析時、これらは適用されません。

  • コードがこのプロダクションと一致する場合は、常に構文エラーをスローします。
このプロダクションは、ObjectLiteralObjectAssignmentPatternのカバー文法として機能することを目的として存在します。 実際のオブジェクト初期化子では発生しません。

12.2.6.2 静的セマンティクス(Static Semantics): ComputedPropertyContains

パラメータ symbol を使用。

  1. false を返す
  1. ComputedPropertyName Contains symbolの結果を返す

12.2.6.3 静的セマンティクス(Static Semantics): Contains

パラメータ symbol を使用。

  1. symbol MethodDefinition なら、 true を返す
  2. 引数symbolを使用して MethodDefinitionComputedPropertyContainsの結果を返す
通常、部分構造に依存する静的セマンティックルールは関数定義を調べません。
  1. symbolReservedWord , false を返す.
  2. symbolIdentifier で、symbolStringValueIdentifierNameStringValue と同じなら、true をす
  3. false を返す

12.2.6.4 静的セマンティクス(Static Semantics): IsComputedPropertyKey

  1. false を返す
  1. true を返す

12.2.6.5 静的セマンティクス(Static Semantics): PropName

  1. IdentifierReferenceStringValue を返す
  1. emptyを返す
  1. PropertyNamePropName を返す
  1. IdentifierNameStringValue を返す
  1. コードユニットがStringLiteralSVであるString値を返す
  1. NumericLiteralNumericValuenbr とする
  2. ! ToString(nbr)を返す
  1. emptyを返す

12.2.6.6 静的セマンティクス(Static Semantics): PropertyNameList

  1. PropertyDefinitionPropName が empty なら、 空の新規 List を返す
  2. PropertyDefinitionPropName を含む新規 Listを返す
  1. PropertyDefinitionListPropertyNameListlist とする
  2. PropertyDefinitionPropNameempty なら、 list を返す
  3. PropertyDefinitionPropNamelist の最後に追加する
  4. listを返す

12.2.6.7 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. OrdinaryObjectCreate(%Object.prototype%)を返す
  1. OrdinaryObjectCreate(%Object.prototype%) を obj とする
  2. 引数 objtrue を使用して ? PropertyDefinitionListPropertyDefinitionEvaluation を実行
  3. obj を返す
  1. IdentifierNameStringValue を返す
  1. コードユニットがStringLiteralSVであるString値を返す
  1. NumericLiteralNumericValuenbr とする
  2. ! ToString(nbr) を返す
  1. AssignmentExpression の評価結果を exprValue とする
  2. ? GetValue(exprValue) を propName とする
  3. ? ToPropertyKey(propName) を返す

12.2.6.8 ランタイムセマンティクス(Runtime Semantics): PropertyDefinitionEvaluation

パラメータ objectenumerable を使用。

  1. 引数objectenumerable を使用して、? PropertyDefinitionListPropertyDefinitionEvaluation を実行
  2. 引数objectenumerable を使用して、PropertyDefinitionPropertyDefinitionEvaluation の実行結果を返す
  1. AssignmentExpression の評価結果 を exprValue とする
  2. ? GetValue(exprValue) を fromValue とする
  3. 空の新規ListexcludedNames とする
  4. ? CopyDataProperties(object, fromValue, excludedNames)を返す
  1. IdentifierReferenceStringValuepropName とする
  2. IdentifierReference の評価結果を exprValue とする
  3. ? GetValue(exprValue) を propValue とする
  4. Assert: enumerabletrue
  5. Assert: objectは、構成不可能なプロパティを持っていない、拡張可能な通常のオブジェクト
  6. ! CreateDataPropertyOrThrow(object, propName, propValue)を返す
  1. PropertyName の評価結果を propKey とする
  2. ReturnIfAbrupt(propKey)
  3. IsAnonymousFunctionDefinition(AssignmentExpression ) が true なら、
    1. 引数 propKey を使用して、 AssignmentExpressionNamedEvaluationpropValue とする
  4. Else,
    1. AssignmentExpression の評価結果を exprValueRef とする
    2. ? GetValue(exprValueRef) を propValue とする
  5. Assert: enumerabletrue
  6. Assert: objectは、構成不可能なプロパティを持っていない、拡張可能な通常のオブジェクト
  7. ! CreateDataPropertyOrThrow(object, propKey, propValue)を返す
このプロダクションの代替セマンティクスは、B.3.1に示されています。

12.2.7 関数定義式(Function Defining Expressions)

次のプロダクションは14.1を参照

次のプロダクションは14.4を参照

次のプロダクションは14.6を参照

次のプロダクションは14.7を参照

次のプロダクションは14.5を参照

.

12.2.8 正規表現リテラル(Regular Expression Literals)

構文:

11.8.5を参照

12.2.8.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

12.2.8.2 静的セマンティクス(Static Semantics): IsValidRegularExpressionLiteral ( literal )

抽象演算IsValidRegularExpressionLiteralは、引数literalが有効な正規表現リテラルであるかどうかを判別します。 次の手順を実行します。

  1. Assert: literalRegularExpressionLiteral
  2. literalFlagTextgimsuy 以外のコードポイントが含まれている、または同じコードポイントが複数含まれているなら、false を返す
  3. literalBodyTextP とする
  4. literalFlagTextu が含まれているなら、
    1. 21.2.1の文法を使用してPを解析する。 その際のゴールシンボルPattern[+U, +N]P が文法に準拠していない、P のいずれかの要素が解析で一致しない、または早期エラー条件が存在するなら false を、 それ以外なら、true を返す
  5. UTF16Encode(P) を stringValue とする
  6. stringValue の各16ビット要素をUnicode BMPコードポイントとして解釈した結果のコードポイントのシーケンス を pText とする。要素にUTF-16デコードは適用されない。
  7. 21.2.1の文法を使用して>pTextを解析する。その際のゴールシンボルPattern[~U, ~N]。解析の結果に GroupName が含まれているなら、 ゴールシンボル Pattern[~U, +N] で再解析する。 P が文法に準拠していない、P のいずれかの要素が解析で一致しない、または早期エラー条件が存在するなら false を、 それ以外なら、true を返す

12.2.8.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ! UTF16Encode(BodyText of RegularExpressionLiteral ) を pattern とする
  2. ! UTF16Encode( RegularExpressionLiteralFlagText ) を flags とする
  3. RegExpCreate(pattern, flags)を返す

12.2.9 テンプレートリテラル(Template Literals)

構文:

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

12.2.9.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate
TemplateLiteral[Yield, Await, Tagged] : SubstitutionTemplate[?Yield, ?Await, ?Tagged]
  • 引数 false を使用して TemplateLiteralTemplateStrings の 結果 の 要素数が 232-1より大きいなら、構文エラーです。
SubstitutionTemplate[Yield, Await, Tagged] :
TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged]
  • [Tagged]パラメーターが設定されていないとき、TemplateHeadNotEscapeSequence が含まれている場合は、構文エラーです
TemplateSpans[Yield, Await, Tagged] : TemplateTail
  • [Tagged]パラメーターが設定されていないとき、 TemplateTailNotEscapeSequence が含まれている場合は、構文エラーです
TemplateMiddleList[Yield, Await, Tagged] :
TemplateMiddle Expression[+In, ?Yield, ?Await]
TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]
  • [Tagged]パラメーターが設定されていないとき、 TemplateMiddleNotEscapeSequence が含まれている場合は、構文エラーです

12.2.9.2 静的セマンティクス(Static Semantics): TemplateStrings

パラメータ raw を使用。

  1. rawfalse なら、
    1. NoSubstitutionTemplateTVstring とする
  2. 1. でないなら、
    1. NoSubstitutionTemplateTRVstring とする
  3. stringを含む単一のList を返す
  1. rawfalse なら、
    1. TemplateHeadTVhead とする
  2. 1.でないなら
    1. TemplateHeadTRVhead とする
  3. 引数 raw を使用して TemplateSpansTemplateStringstail とする
  4. head の後に、 tail の内容が順番に続く List を返す
  1. rawfalse なら、
    1. TemplateTailTVtail とする
  2. 1.でないなら
    1. TemplateTailTRVtail とする
  3. tail を含む単一のList を返す
  1. 引数 raw を使用して TemplateMiddleListTemplateStringsmiddle とする
  2. rawfalse なら、
    1. TemplateTailTVtail とする
  3. 2.でないなら
    1. TemplateTailTRVtail とする
  4. middle の後に tail が順番に続く List を返す
  1. rawfalse なら、
    1. TemplateMiddleTVstring とする
  2. 1.でないなら
    1. TemplateMiddleTRVstring とする
  3. string を含む単一の List を返す
  1. 引数 raw を使用して TemplateMiddleListTemplateStringsfront とする
  2. rawfalse なら、
    1. TemplateMiddleTVlast とする
  3. 2.でないなら
    1. TemplateMiddleTRVlast とする
  4. frontの最後に、last を追加する
  5. frontを返す

12.2.9.3 ランタイムセマンティクス(Runtime Semantics): ArgumentListEvaluation

  1. TemplateLiteraltemplateLiteral とする
  2. GetTemplateObject(templateLiteral) を siteObj とする
  3. siteObjを含むListを返す
  1. TemplateLiteraltemplateLiteral とする
  2. GetTemplateObject(templateLiteral) を siteObj とする
  3. Expression の評価結果を firstSubRef とする
  4. ? GetValue(firstSubRef) を firstSub とする
  5. ? TemplateSpansSubstitutionEvaluationrestSub とする
  6. Assert: restSubList
  7. 最初の要素が siteObj、2番目が firstSub、次がrestSubであるListを返す。restSub には要素を含めることができない。

12.2.9.4 ランタイムセマンティクス(Runtime Semantics): GetTemplateObject ( templateLiteral )

抽象操作GetTemplateObjectは、パースノードtemplateLiteralを引数として呼び出されます。 次の手順を実行します。

  1. 引数 true を使用して templateLiteralTemplateStringsrawStrings とする
  2. 現在のレルムレコードrealm とする
  3. realm.[[TemplateMap]] を templateRegistry とする
  4. For each element e of templateRegistry の要素を e とし、各 e 毎に、
    1. e.[[Site]] が templateLiteral と 同じパースノード なら、
      1. e.[[Array]]を返す
  5. 引数 false を使用して templateLiteralTemplateStringscookedStrings とする
  6. List である cookedStrings の要素数 を count とする
  7. Assert: count232 - 1
  8. ! ArrayCreate(count) を template とする
  9. ! ArrayCreate(count) を rawObj とする
  10. 0index とする
  11. indexcount の間繰り返す
    1. ! ToString(index) を prop とする
    2. cookedStrings[index] のString値を cookedValue とする
    3. template.[[DefineOwnProperty]](prop,プロパティ記述子 { [[Value]]: cookedValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }) を呼び出す
    4. rawStrings[index] のString値を rawValue とする
    5. rawObj.[[DefineOwnProperty]](prop,プロパティ記述子 { [[Value]]: rawValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false })を呼び出す
    6. index + 1index にセットする
  12. SetIntegrityLevel(rawObj, frozen)を実行
  13. template.[[DefineOwnProperty]]("raw",プロパティ記述子 { [[Value]]: rawObj, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false })を呼び出す
  14. SetIntegrityLevel(template, frozen)を実行
  15. templateRegistryRecord { [[Site]]: templateLiteral, [[Array]]: template } を追加
  16. templateを返す
テンプレートオブジェクトを作成しても、突然の完了することはありません。
レルムのプログラムコード内の各TemplateLiteralは、タグ付きテンプレートの評価に使用される一意のテンプレートオブジェクトに関連付けられています(12.2.9.6)。 テンプレートオブジェクトはフリーズされ、特定のタグ付きテンプレートが評価されるたびに同じテンプレートオブジェクトが使用されます。 テンプレートオブジェクトがTemplateLiteralの最初の評価時に遅延して作成されるか、最初の評価の前に熱心に作成されるかは、実装での選択です。
この仕様の将来の版では、テンプレートオブジェクトに列挙不可プロパティを追加定義する可能性があります。

12.2.9.5 ランタイムセマンティクス(Runtime Semantics): SubstitutionEvaluation

  1. 空の新規Listを返す
  1. TemplateMiddleListSubstitutionEvaluation の結果を返す
  1. Expression の評価結果を subRef とする
  2. ? GetValue(subRef) を sub とする
  3. sub のみを含む List を返す
  1. ? TemplateMiddleListSubstitutionEvaluationpreceding とする
  2. Expression の評価結果 を nextRef とする
  3. ? GetValue(nextRef) を next とする
  4. Listである preceding の 最後に next を追加する
  5. preceding を返す

12.2.9.6 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. コードユニットがNoSubstitutionTemplateTVの要素である文字列値を返す(11.8.6参照)
  1. the TV of TemplateHeadTVhead とする(11.8.6参照)
  2. Expression の評価結果を subRef とする
  3. ? GetValue(subRef) を sub とする
  4. ? ToString(sub) を middle とする
  5. tail とする
  6. ReturnIfAbrupt(tail)
  7. headmiddletail の文字列連結を返す
Expressionの値に適用される文字列変換セマンティクスは、+演算子ではなくString.prototype.concatに似ています。
  1. TemplateTailTVtail とする(11.8.6参照)
  2. tail のコードユニットで構成されるString値を返す
  1. TemplateMiddleList の評価結果 を head とする
  2. ReturnIfAbrupt(head)
  3. the TV of TemplateTailTVtail とする(11.8.6参照)
  4. headtail の文字列連結を返す
  1. the TV of TemplateMiddleTVhead とする(11.8.6参照)
  2. Expression の評価結果を subRef とする
  3. ? GetValue(subRef) を sub とする
  4. ? ToString(sub) を middle とする
  5. head のコードユニットと、それに続く middle の要素で構成されるコードユニットのシーケンスを返す
Expressionの値に適用される文字列変換セマンティクスは、+演算子ではなくString.prototype.concatに似ています。
  1. TemplateMiddleList の評価結果を rest とする
  2. ReturnIfAbrupt(rest)
  3. the TV of TemplateMiddleTVmiddle とする(11.8.6参照)/li>
  4. Expression の評価結果を subRef とする
  5. ? GetValue(subRef) を sub とする
  6. ? ToString(sub) を last とする
  7. restmiddlelastの要素で構成されるコードユニットのシーケンスを返す
Expressionの値に適用される文字列変換セマンティクスは、+演算子ではなくString.prototype.concatに似ています。

12.2.10 グループ化演算子(The Grouping Operator)

12.2.10.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

12.2.10.2 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. ExpressionIsFunctionDefinition を返す

12.2.10.3 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. ExpressionAssignmentTargetType を返す

12.2.10.4 ランタイムセマンティクス(Runtime Semantics): NamedEvaluation

引数 name を使用。

  1. of CoverParenthesizedExpressionAndArrowParameterListCoveredParenthesizedExpressionexpr とする
  2. 引数 name を使用して exprNamedEvaluation を実行した結果を返す
  1. Assert: IsAnonymousFunctionDefinition(Expression ) は true
  2. 引数 name を使用して ExpressionNamedEvaluation を実行した結果返す

12.2.10.5 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. of CoverParenthesizedExpressionAndArrowParameterListCoveredParenthesizedExpressionexpr とする
  2. expr の評価結果を返す
  1. Expression の評価結果を返す。これはReference型の場合がある。
このアルゴリズムは、Expressionの評価結果に GetValue を適用しません。 これの主な理由は、deletetypeofなどの演算子を括弧で囲まれた式に適用できるようにするためです。

12.3 左辺式(Left-Hand-Side Expressions)

構文:

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
newMemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
SuperProperty[Yield, Await] :
super[Expression[+In, ?Yield, ?Await] ]
super.IdentifierName
NewTarget :
new.target
ImportMeta :
import.meta
NewExpression[Yield, Await] :
MemberExpression[?Yield, ?Await]
newNewExpression[?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]
SuperCall[Yield, Await] :
superArguments[?Yield, ?Await]
ImportCall[Yield, Await] :
import(AssignmentExpression[+In, ?Yield, ?Await] )
Arguments[Yield, Await] :
()
(ArgumentList[?Yield, ?Await] )
(ArgumentList[?Yield, ?Await] ,)
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]
OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await]
OptionalChain[?Yield, ?Await] [Expression[+In, ?Yield, ?Await] ]
OptionalChain[?Yield, ?Await] .IdentifierName
OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
LeftHandSideExpression[Yield, Await] :
NewExpression[?Yield, ?Await]
CallExpression[?Yield, ?Await]
OptionalExpression[?Yield, ?Await]

補足構文:

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

12.3.1 静的セマンティクス(Static Semantics)

12.3.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

  • コードがこのプロダクションに一致する場合、構文エラーです。
このプロダクションは、次のコードが自動セミコロン挿入ルール(11.9)を適用させないために存在します。

a?.b
`c`

上の2行を2つのステートメントとして解釈されるようにします。オプションの連鎖なしで同様のコードとの一貫性を維持するためです。

a.b
`c`

これは有効なステートメントであり、自動セミコロン挿入が適用されません。

ImportMeta :
import.meta

12.3.1.2 静的セマンティクス(Static Semantics): CoveredCallExpression

12.3.1.3 静的セマンティクス(Static Semantics): Contains

引数 symbol を使用。

  1. MemberExpressionContains symboltrue なら、 true を返す
  2. symbolReservedWord なら false を返す
  3. symbolIdentifiersymbolStringValueIdentifierNameStringValue と同じ値なら、 true を返す
  4. false を返す.
  1. symbolReservedWord super なら、 true を返す
  2. symbolReservedWord なら false を返す
  3. symbolIdentifier で symbol の StringValueIdentifierNameStringValue と同じ値なら、 true を返す
  4. false を返す
  1. CallExpression Contains symboltrue なら、 true を返す
  2. symbolReservedWord なら false を返す
  3. symbolIdentifiersymbol の StringValueIdentifierNameStringValue と同値なら、 true を返す
  4. false を返す
  1. symbolReservedWord なら false を返す
  2. symbolIdentifiersymbol の StringValueIdentifierNameStringValue と同値なら、 true を返す
  3. false を返す
  1. OptionalChain Contains symboltrue なら、 true を返す
  2. symbolReservedWord なら false を返す
  3. symbolIdentifiersymbol の StringValueIdentifierNameStringValue と同値なら、 true を返す
  4. false を返す

12.3.1.4 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.3.1.5 静的セマンティクス(Static Semantics): IsDestructuring

  1. PrimaryExpressionObjectLiteralArrayLiteral なら true を返す
  2. false を返す.
  1. false を返す

12.3.1.6 静的セマンティクス(Static Semantics): IsIdentifierRef

  1. false を返す

12.3.1.7 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. simpleを返す
NewTarget :
new.target
ImportMeta :
import.meta
  1. invalidを返す

12.3.2 プロパティアクセサー(Property Accessors)

プロパティには、ドット + 名前表記でアクセスします。

MemberExpression . IdentifierName
CallExpression . IdentifierName

または角括弧表記でアクセスします。

MemberExpression [ Expression ]
CallExpression [ Expression ]

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

MemberExpression . IdentifierName

動作は次と同じです。

MemberExpression [ <identifier-name-string> ]

ここで、<identifier-name-string>は、IdentifierNameStringValue を評価した結果です。

同様に

CallExpression . IdentifierName

動作は次と同じです。

CallExpression [ [ <identifier-name-string> ]

12.3.2.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. MemberExpression の評価結果を baseReference とする
  2. ? GetValue(baseReference) を baseValue とする
  3. MemberExpression に一致するコードが strictモードコードであるなら、 true を、異なるなら falsestrict とする
  4. ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression , strict)を返す
  1. MemberExpression の評価結果を baseReference とする
  2. ? GetValue(baseReference) を baseValue とする
  3. MemberExpression に一致するコードが strictモードコードであるなら、true を、異なるなら falsestrict とする
  4. ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName , strict)を返す
  1. CallExpression の評価結果を baseReference とする
  2. ? GetValue(baseReference) を baseValue とする
  3. CallExpression に一致するコードが strictモードコードであるなら、 true を、異なるなら falsestrict とする
  4. ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression , strict)を返す
  1. CallExpression の評価結果を baseReference とする
  2. ? GetValue(baseReference) を baseValue とする
  3. CallExpression に一致するコードが strictモードコードであるなら、 true を、異なるなら falsestrict とする
  4. ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName , strict)を返す

12.3.3 ランタイムセマンティクス(Runtime Semantics): EvaluatePropertyAccessWithExpressionKey ( baseValue, expression, strict )

抽象操作EvaluatePropertyAccessWithExpressionKeyは、引数として値baseValueパースノードexpression、およびブール引数strictを取ります。 次の手順を実行します。

  1. expression の評価結果を propertyNameReference とする
  2. ? GetValue(propertyNameReference) を propertyNameValue とする
  3. ? RequireObjectCoercible(baseValue) を bv とする
  4. ? ToPropertyKey(propertyNameValue) を propertyKey とする
  5. 基本値コンポーネントbv、参照名コンポーネントpropertyKey、strict参照フラグstrictReference型の値を返す

12.3.4 ランタイムセマンティクス(Runtime Semantics): EvaluatePropertyAccessWithIdentifierKey ( baseValue, identifierName, strict )

抽象操作EvaluatePropertyAccessWithIdentifierKeyは、引数として値baseValue、解析ノードidentifierName、およびブール引数strictを取ります。 次の手順を実行します。

  1. Assert: identifierNameIdentifierName
  2. ? RequireObjectCoercible(baseValue) を bv とする
  3. identifierNameStringValuepropertyNameString とする
  4. 基本値コンポーネントbv、参照名コンポーネントpropertyNameString、strict参照フラグstrictReference型の値を返す

12.3.5 new オペレーター(The new Operator)

12.3.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ? EvaluateNew(NewExpression , empty)を返す
12.3.5.1.1 ランタイムセマンティクス(Runtime Semantics): EvaluateNew ( constructExpr, arguments )

抽象操作EvaluateNewは引数constructExprargumentsを使用して、次の手順を実行します。

  1. Assert: constructExprNewExpressionMemberExpression
  2. Assert: argumentsemptyArguments
  3. constructExpr の評価結果を ref とする
  4. ? GetValue(ref) を constructor とする
  5. argumentsempty なら、 空の新規ListargList とする
  6. 5.でないなら
    1. ? argumentsArgumentListEvaluationargList とする
  7. IsConstructor(constructor) が false なら、TypeError例外をスローする
  8. ? Construct(constructor, argList)を返す

12.3.6 関数呼び出し(Function Calls)

12.3.6.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. CoverCallExpressionAndAsyncArrowHeadCoveredCallExpressionexpr とする
  2. exprMemberExpressionmemberExpr とする
  3. exprArgumentsarguments とする
  4. memberExpr の評価結果を ref とする
  5. ? GetValue(ref) を func とする
  6. Type(ref) が Reference型 で、 IsPropertyReference(ref) が false で、 GetReferencedName(ref) が "eval" なら、
    1. SameValue(func, %eval%) が true なら、
      1. ? argumentsArgumentListEvaluationargList とする
      2. argList が要素を持っていないなら、 undefined を返す
      3. argList の最初の要素を evalArg とする
      4. CallExpression に一致するソースコードが、 strictモードコード なら、 truestrictCaller とする
        Otherwise false を strictCaller とする
      5. 現在のレルムレコードevalRealm とする
      6. ? ["18","h-performeval"](evalArg, evalRealm, strictCaller, true)を返す
  7. CallExpressionthisCall とする
  8. IsInTailPosition(thisCall) を tailCall とする
  9. ? EvaluateCall(func, ref, arguments, tailCall)を返す

ダイレクトeval

ステップ6.a.viを実行するCallExpression評価は、ダイレクトevalです。

  1. CallExpression の評価結果を ref とする
  2. ? GetValue(ref) を func とする
  3. CallExpressionthisCall とする
  4. IsInTailPosition(thisCall) を tailCall とする
  5. ? EvaluateCall(func, ref, Arguments , tailCall)を返す

12.3.6.2 ランタイムセマンティクス(Runtime Semantics): EvaluateCall ( func, ref, arguments, tailPosition )

抽象操作EvaluateCallは、引数として値func、値refパースノードarguments、およびブール値tailPositionを取ります。 次の手順を実行します。

  1. Type(ref) が Reference型なら、
    1. IsPropertyReference(ref) が true なら、
      1. GetThisValue(ref) を thisValue とする
    2. a. でないなら、
      1. Assert: ref の ベースは 環境レコード
      2. GetBase(ref) を refEnv とする
      3. refEnv.WithBaseObject() を thisValue とする
        .
  2. 1.でないなら、
    1. undefinedthisValue とする
  3. ? argumentsArgumentListEvaluationargList とする
  4. Type(func) が Object型でないなら、TypeError例外をスローする
  5. IsCallable(func) が false なら、TypeError例外をスローする
  6. tailPositiontrue なら、PrepareForTailCallCall() を実行する
  7. Call(func, thisValue, argList) を result とする
  8. Assert: tailPositiontrue なら、上記の呼び出しはここに戻らない。代わりに、次の戻りがすでに発生したかのように評価が続行される。
  9. Assert: result突然の完了 ではないなら、 Type(result) は ECMAScript言語値
  10. resultを返す

12.3.7 superキーワード(The super Keyword)

12.3.7.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. GetThisEnvironment() を env とする
  2. ? env.GetThisBinding() を actualThis とする
  3. Expression の評価結果を propertyNameReference とする
  4. ? GetValue(propertyNameReference) を propertyNameValue とする
  5. ? ToPropertyKey(propertyNameValue) を propertyKey とする
  6. SuperProperty に一致するコードが strictモードコード なら true、異なるなら falsestrict とする
  7. ? MakeSuperPropertyReference(actualThis, propertyKey, strict)を返す
  1. GetThisEnvironment() を env とする
  2. ? env.GetThisBinding() を actualThis とする
  3. IdentifierNameStringValue propertyKey とする
  4. SuperProperty に一致するコードが、 strictモードコード なら true、異なるなら falsestrict とする
  5. ? MakeSuperPropertyReference(actualThis, propertyKey, strict)を返す
  1. GetNewTarget() を newTarget とする
  2. Assert: Type(newTarget) は Object型
  3. ! GetSuperConstructor() を func とする
  4. ? ArgumentsArgumentListEvaluationargList とする
  5. IsConstructor(func) が false なら、TypeError例外をスローする.
  6. ? Construct(func, argList, newTarget) を result とする
  7. GetThisEnvironment() を thisER とする
  8. ? thisER.BindThisValue(result)を返す

12.3.7.2 ランタイムセマンティクス(Runtime Semantics): GetSuperConstructor ( )

抽象操作GetSuperConstructorは、次の手順を実行します。

  1. GetThisEnvironment() を envRec とする
  2. Assert: envRec関数環境レコード
  3. envRec.[[FunctionObject]] を activeFunction とする
  4. Assert: activeFunction is an ECMAScript関数オブジェクト.
  5. ! activeFunction.[[GetPrototypeOf]]() を superConstructor とする
  6. superConstructorを返す

12.3.7.3 ランタイムセマンティクス(Runtime Semantics): MakeSuperPropertyReference ( actualThis, propertyKey, strict )

抽象操作MakeSuperPropertyReferenceは引数actualThispropertyKey、およびstrictを指定し、次の手順を実行します。

  1. GetThisEnvironment() を env とする
  2. Assert: env.HasSuperBinding() は true
  3. ? env.GetSuperBase() を baseValue とする
  4. ? RequireObjectCoercible(baseValue) を bv とする
  5. 基本値コンポーネントbv、参照名コンポーネントpropertyKey、thisValueコンポーネントactualThis、strict参照フラグstrictスーパーリファレンスであるReference型の値を返す

12.3.8 引数リスト(Argument Lists)

引数リストを評価すると、値のリストが生成されます。

12.3.8.1 ランタイムセマンティクス(Runtime Semantics): ArgumentListEvaluation

  1. 空の新規Listを返す
  1. AssignmentExpression の評価結果を ref とする
  2. ? GetValue(ref) を arg とする
  3. argが単一要素のListを返す
  1. 空の新規Listlist とする
  2. AssignmentExpression を spreadRef とする
  3. ? GetValue(spreadRef) の評価結果を spreadObj とする
  4. ? GetIterator(spreadObj) を iteratorRecord とする
  5. 繰り返す
    1. ? IteratorStep(iteratorRecord) を next とする
    2. nextfalse なら、list を返す
    3. ? IteratorValue(next) を nextArg とする
    4. list の最後に nextArg を追加する
  1. ? of ArgumentListArgumentListEvaluationprecedingArgs とする
  2. AssignmentExpression の評価結果を ref とする
  3. ? GetValue(ref) を arg とする
  4. precedingArgs の最後に arg を追加する
  5. precedingArgs を返す
  1. ? ArgumentListArgumentListEvaluationprecedingArgs とする
  2. AssignmentExpression の評価結果を spreadRefとする
  3. ? GetIterator(? GetValue(spreadRef)) を iteratorRecord とする
  4. 繰り返す
    1. ? IteratorStep(iteratorRecord) を next とする
    2. nextfalse なら、 precedingArgs を返す
    3. ? IteratorValue(next) を nextArg とする
    4. precedingArgs の最後に nextArg を追加する

12.3.9 オプションチェーン(Optional Chains)

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

12.3.9.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. MemberExpression の評価結果を baseReference とする
  2. ? GetValue(baseReference) を baseValue とする
  3. baseValueundefinednull なら、
    1. undefined を返す
  4. 引数 baseValuebaseReference を使用して OptionalChainChainEvaluation の結果を返す
  1. CallExpression の評価結果を baseReference とする
  2. ? GetValue(baseReference) を baseValue とする
  3. If baseValueundefinednull なら、
    1. undefined を返す
  4. 引数 baseValuebaseReference を使用して OptionalChainChainEvaluation の結果を返す
  1. OptionalExpression の評価結果を baseReference とする
  2. ? GetValue(baseReference) を baseValue とする
  3. baseValueundefinednull なら、
    1. undefined を返す
  4. 引数 baseValuebaseReference を使用して OptionalChainChainEvaluation の結果を返す

12.3.9.2 ランタイムセマンティクス(Runtime Semantics): ChainEvaluation

引数 baseValuebaseReference を使用。

  1. OptionalChainthisChain とする
  2. IsInTailPosition(thisChain) を tailCall とする
  3. ? EvaluateCall(baseValue, baseReference, Arguments , tailCall)を返す
  1. OptionalChain に一致するコードが strictモードコード なら true 、異なるなら falsestrict とする
  2. ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression , strict)を返す
  1. OptionalChain に一致するコードが strictモードコード なら true、 異なるなら falsestrict とする
  2. ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName , strict)を返す
  1. OptionalChainoptionalChain とする
  2. 引数 baseValuebaseReference を使用して ? optionalChainChainEvaluationnewReference とする
  3. ? GetValue(newReference) を newValue とする
  4. OptionalChainthisChain とする
  5. IsInTailPosition(thisChain) を tailCall とする
  6. ? EvaluateCall(newValue, newReference, Arguments , tailCall) を返す
  1. OptionalChainoptionalChain とする
  2. 引数 baseValuebaseReference を使用して ? optionalChainChainEvaluationnewReference とする
  3. ? GetValue(newReference) を newValue とする
  4. OptionalChain に一致するコードが strictモードコード なら true、 異なるなら falsestrict とする
  5. ? EvaluatePropertyAccessWithExpressionKey(newValue, Expression , strict) を返す
  1. OptionalChainoptionalChain とする
  2. 引数 baseValuebaseReference を使用して ? optionalChainChainEvaluationnewReference とする
  3. ? GetValue(newReference) を newValue とする
  4. OptionalChain に一致するコードが strictモードコード なら true、異なるなら falsestrict とする
  5. ? EvaluatePropertyAccessWithIdentifierKey(newValue, IdentifierName , strict)を返す

12.3.10 インポート呼び出し(Import Calls)

12.3.10.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ! GetActiveScriptOrModule() を referencingScriptOrModule とする
  2. AssignmentExpression の評価結果を argRef とする
  3. ? GetValue(argRef) を specifier とする
  4. ! NewPromiseCapability(%Promise%) を promiseCapability とする
  5. ToString(specifier) を specifierString とする
  6. IfAbruptRejectPromise(specifierString, promiseCapability).
  7. ! HostImportModuleDynamically(referencingScriptOrModule, specifierString, promiseCapability)を実行
  8. promiseCapability.[[Promise]] を返す

12.3.11 タグ付きテンプレート(Tagged Templates)

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

12.3.11.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. MemberExpression の評価結果を tagRef とする
  2. ? GetValue(tagRef) を tagFunc とする
  3. MemberExpressionthisCall とする
  4. IsInTailPosition(thisCall) を tailCall とする
  5. ? EvaluateCall(tagFunc, tagRef, TemplateLiteral , tailCall)を返す
  1. 評価結果 CallExpression を tagRef とする
  2. ?GetValue(tagRef) を tagFunc とする
  3. this CallExpression を thisCall とする
  4. IsInTailPosition(thisCall) を tailCall とする
  5. を返す?EvaluateCall(tagFunc, tagRef, TemplateLiteral , tailCall).

12.3.12 メタプロパティ(Meta Properties)

12.3.12.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

NewTarget : new.target
  1. GetNewTarget()を返す
ImportMeta : import.meta
  1. !GetActiveScriptOrModule() を module とする
  2. Assert: moduleソーステキストモジュールレコード
  3. module.[[ImportMeta]] を importMeta とする
  4. importMetaempty なら、
    1. ! OrdinaryObjectCreate(null) を importMeta にセットする
    2. ! HostGetImportMetaProperties(module) を importMetaValues とする
    3. mportMetaValues の各Record型{[[Key]],[[Value]]}要素を p とし、各 p ごとに、
      1. !CreateDataPropertyOrThrow(importMeta, p.[[Key]], p.[[Value]])を実行
    4. ! HostFinalizeImportMeta(importMeta, module)を実行
    5. importMetamodule.[[ImportMeta]] にセットする
    6. importMetaを返す
  5. 4. でなければ
    1. Assert:Type(importMeta) は Object型
    2. importMetaを返す
12.3.12.1.1 ランタイムセマンティクス(Runtime Semantics): HostGetImportMetaProperties ( moduleRecord )

HostGetImportMetaPropertiesは、実装で定義された抽象操作であす。import.metaから返されたオブジェクトのプロパティキーと値をホストが提供できるようにします。

HostGetImportMetaPropertiesの実装は、次の要件に準拠させる必要があります。

  • [[Key]]と[[Value]]の2つのフィールドを持つRecordを要素とするListを返す必要があります。
  • 各レコードの[[Key]]フィールドは、プロパティキーです。つまり、IsPropertyKeyを、適用したらtrueを返す必要があります。
  • 各レコードの[[Value]]フィールドは、ECMAScript値である必要があります。
  • 常に正常に完了する必要があります(つまり、突然の完了を返してはいけません)。

HostGetImportMetaPropertiesのデフォルトの実装は、新しい空のリストを返します。

12.3.12.1.2 ランタイムセマンティクス(Runtime Semantics): HostFinalizeImportMeta ( importMeta, moduleRecord )

HostFinalizeImportMetaは、実装で定義された抽象操作です。ホストが特別な操作を実行して、import.metaから返されるオブジェクトを準備できるようにします。

通常、ホストはHostGetImportMetaPropertiesを定義し、HostFinalizeImportMetaはデフォルト動作のみ実装します。ただしHostFinalizeImportMetaは、オブジェクトをECMAScriptコードに公開する前に操作するホストに対して"エスケープ ハッチ" を提供します。

HostFinalizeImportMetaの実装は、次の要件に準拠する必要があります。

  • 常に正常に完了する必要があります(つまり、突然の完了を返してはいけません)

HostFinalizeImportMetaのデフォルトの実装は、NormalCompletion(empty)を返します。

12.4 更新式(Update Expressions)

構文:

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

12.4.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

  • UnaryExpressionAssignmentTargetTypesimpleでないなら、早期構文エラーです

12.4.2 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.4.3 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalidを返す

12.4.4 後置インクリメント演算子(Postfix Increment Operator)

12.4.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. LeftHandSideExpression の評価結果を lhs とする
  2. ? ToNumeric(? GetValue(lhs)) を oldValue とする
  3. ! Type(oldvalue)::add(oldValue,Type(oldValue)::unit) を newValue とする
  4. ? PutValue(lhs, newValue)を実行
  5. oldValueを返す

12.4.5 後置デクリメント演算子(Postfix Decrement Operator)

12.4.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. LeftHandSideExpression の評価結果を lhs とする
  2. ? ToNumeric(? GetValue(lhs)) を oldValue とする
  3. ! Type(oldvalue)::subtract(oldValue, Type(oldValue)::unit) を newValue とする
  4. ? PutValue(lhs, newValue)を実行
  5. oldValueを返す

12.4.6 前置インクリメント演算子(Prefix Increment Operator)

12.4.6.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果 を expr とする
  2. ? ToNumeric(? GetValue(expr)) を oldValue とする
  3. ! Type(oldvalue)::add(oldValue, Type(oldValue)::unit) を newValue とする
  4. ? PutValue(expr, newValue)を実行
  5. newValueを返す

12.4.7 前置デクリメント演算子(Prefix Decrement Operator)

12.4.7.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果を expr とする
  2. ? ToNumeric(? GetValue(expr)) を oldValue とする
  3. ! Type(oldvalue)::subtract(oldValue, Type(oldValue)::unit) を newValue とする
  4. ? PutValue(expr, newValue)を実行
  5. newValueを返す

12.5 単項演算子(Unary Operators)

構文:

UnaryExpression[Yield, Await] :
UpdateExpression[?Yield, ?Await]
deleteUnaryExpression[?Yield, ?Await]
voidUnaryExpression[?Yield, ?Await]
typeofUnaryExpression[?Yield, ?Await]
+UnaryExpression[?Yield, ?Await]
-UnaryExpression[?Yield, ?Await]
~UnaryExpression[?Yield, ?Await]
!UnaryExpression[?Yield, ?Await]
[+Await]AwaitExpression[?Yield]

12.5.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.5.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalidを返す

12.5.3 delete演算子(The delete Operator)

12.5.3.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

最後のルールは、最初のルールを再帰的に適用するため、delete (((foo))) などの式が初期エラーを生成することを意味します。

12.5.3.2 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果を ref とする
  2. ReturnIfAbrupt(ref)
  3. Type(ref) が Reference でないなら、 true を返す
  4. IsUnresolvableReference(ref) が true なら、
    1. Assert: IsStrictReference(ref) は false
    2. true を返す
  5. IsPropertyReference(ref) が true なら、
    1. IsSuperReference(ref) が true なら、ReferenceError例外をスローする
    2. ! ToObject(GetBase(ref)) を baseObj とする
    3. ? baseObj.[[Delete]](GetReferencedName(ref)) を deleteStatus とする
      .
    4. deleteStatusfalse で、 IsStrictReference(ref) が true なら、TypeError例外をスローする
    5. deleteStatusを返す
  6. 5.でないなら、
    1. Assert: ref環境レコード バインディングへのReference
    2. GetBase(ref) を bindings とする
    3. ? bindings.DeleteBinding(GetReferencedName(ref))を返す
strictモードコード内のでdelete演算子のUnaryExpressionが、変数、関数引数、または関数名への直接参照である場合、SyntaxError例外がスローされます。 さらに、strictモードコード内のdelete演算子で、削除するプロパティの属性が{ [[Configurable]]: false }の場合、TypeError例外がスローされます。

12.5.4 void演算子(The void Operator)

12.5.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果を expr とする
  2. ? GetValue(expr)を実行
  3. undefined を返す
GetValueは、観察可能な副作用がある可能性があります。そのため、値が使用されていない場合でも呼び出す必要があります。

12.5.5 typeof演算子(The typeof Operator)

12.5.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果を val とする
  2. Type(val) が Reference なら、
    1. IsUnresolvableReference(val) が true なら、"undefined" を返す
  3. ? GetValue(val) を val にセットする
  4. 表35を参照して、対応する文字列を返す
表35: typeof演算の結果
val の型 結果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol "symbol"
BigInt "bigint"
Object ([[Call]]なし) "object"
Object ([[Call]]あり) "function"

12.5.6 単項+演算子(Unary + Operator)

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

12.5.6.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果を expr とする
  2. ? ToNumber(? GetValue(expr))を返す

12.5.7 単項-演算子(Unary - Operator)

単項-演算子は、オペランドを数値型に変換してから、否定します。 +0を否定すると-0が生成され、-0を否定すると+0が生成されます。

12.5.7.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果を expr とする
  2. ? ToNumeric(? GetValue(expr)) を oldValue とする
  3. Type(oldValue) を T とする
  4. ! T::unaryMinus(oldValue)を返す

12.5.8 ビット否定演算子(Bitwise NOT Operator) ( ~ )

12.5.8.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果を expr とする
  2. ? ToNumeric(? GetValue(expr)) を oldValue とする
  3. Type(oldValue) を T とする
  4. ! T::bitwiseNOT(oldValue)を返す

12.5.9 論理否定演算子(Logical NOT Operator) ( ! )

12.5.9.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UnaryExpression の評価結果を expr とする
  2. ! ToBoolean(? GetValue(expr)) を oldValue とする
  3. oldValuetrue なら、 false を返す
  4. true を返す

12.6 べき乗演算子(Exponentiation Operator)

構文:

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

12.6.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.6.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalidを返す

12.6.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. UpdateExpression の評価結果を left とする
  2. ? GetValue(left) を leftValue とする
  3. ExponentiationExpression の評価結果を right とする
  4. ? GetValue(right) を rightValue とする
  5. ? ToNumeric(leftValue) を base とする
  6. ? ToNumeric(rightValue) を exponent とする
  7. Type(base) が Type(exponent) と異なるなら、 TypeError例外をスローする
  8. ? Type(base)::exponentiate(base, exponent)を返す

12.7 乗算演算子(Multiplicative Operators)

構文:

MultiplicativeOperator : どれかひとつ
*/%

12.7.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.7.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.7.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. MultiplicativeExpression の評価結果を left とする
  2. ? GetValue(left) を leftValue とする
  3. ExponentiationExpression の評価結果を right とする
  4. ? GetValue(right) を rightValue とする
  5. ? ToNumeric(leftValue) を lnum とする
  6. ? ToNumeric(rightValue) を rnum とする
  7. Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする
  8. Type(lnum) を T とする
  9. MultiplicativeOperator が * なら、 T::multiply(lnum, rnum) を返す
  10. MultiplicativeOperator が / なら、T::divide(lnum, rnum) を返す
  11. 10. でないなら、
    1. Assert: MultiplicativeOperator は %
    2. T::remainder(lnum, rnum)を返す

12.8 加算演算子(Additive Operators)

構文:

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

12.8.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.8.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.8.3 The Addition Operator ( + )

加算演算子は、文字列の連結または数値の加算をおこないます。

12.8.3.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. AdditiveExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. MultiplicativeExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. ? ToPrimitive(lval) を lprim とする
  6. ? ToPrimitive(rval) を rprim とする
  7. Type(lprim) か Type(rprim) が String型なら、
    1. ? ToString(lprim) を lstr とする
    2. ? ToString(rprim) を rstr とする
    3. lstrrstr の文字列連結を返す
  8. ? ToNumeric(lprim) を lnum とする
  9. ? ToNumeric(rprim) を rnum とする
  10. Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする.
  11. Type(lnum) を T とする
  12. T::add(lnum, rnum)を返す
5と6のToPrimitiveの呼び出しは、ヒントが提供されません。日付オブジェクトは、ヒントがないとき、ヒント文字列が指定されたかのように処理します。その他の標準オブジェクトは、ヒントがないとき、ヒント番号が指定されているかのように処理します。 エキゾチックなオブジェクトは、他の方法で処理する場合があります。
7は、論理積演算の代わりに論理積演算を使用するという点で、抽象関係比較アルゴリズムの3とは異なります。

12.8.4 減算演算子(The Subtraction Operator) ( - )

12.8.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. AdditiveExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. MultiplicativeExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. ? ToNumeric(lval) を lnum とする
  6. ? ToNumeric(rval) を rnum とする
  7. Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする
  8. Type(lnum)を T とする
  9. T::subtract(lnum, rnum)を返す

12.9 ビットシフト演算子(Bitwise Shift Operators)

構文:

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

12.9.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.9.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.9.3 左シフト演算子(The Left Shift Operator) ( << )

右オペランドで指定された数だけ、左オペランドに対してビット単位の左シフト演算をおこないます。

12.9.3.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ShiftExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. AdditiveExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. ? ToNumeric(lval) を lnum とする
  6. ? ToNumeric(rval) を rnum とする
  7. Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする
  8. Type(lnum) を T とする
  9. T::leftShift(lnum, rnum)を返す

12.9.4 The Signed Right Shift Operator ( >> )

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

12.9.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ShiftExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. AdditiveExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. ? ToNumeric(lval) を lnum とする
  6. ? ToNumeric(rval) を rnum とする
  7. Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする
  8. Type(lnum) を T とする
  9. T::signedRightShift(lnum, rnum)を返す

12.9.5 T符号なし右シフト演算子(he Unsigned Right Shift Operator) ( >>> )

右のオペランドで指定された数だけ、左のオペランドに対してゼロを埋めるビット単位の右シフト演算をおこないます。

12.9.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ShiftExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. AdditiveExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. ? ToNumeric(lval) を lnum とする
  6. ? ToNumeric(rval) を rnum とする
  7. Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする
  8. Type(lnum) を T とする
  9. T::unsignedRightShift(lnum, rnum) を返す

12.10 関係演算子(Relational Operators)

関係演算子の評価結果は常にブール型です。演算子によって指定された関係が、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] instanceofShiftExpression[?Yield, ?Await]
[+In]RelationalExpression[+In, ?Yield, ?Await] inShiftExpression[?Yield, ?Await]
[In]文法パラメーターは、関係式のin演算子とforステートメントのin演算子を混同しないようにするために必要です。

12.10.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.10.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.10.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. RelationalExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. ShiftExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. 抽象関係比較 lval < rval の実行結果を r とする
  6. ReturnIfAbrupt(r)
  7. rundefined なら false を、 異なるなら r を返す
  1. RelationalExpression 評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. ShiftExpression 評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. LeftFirstfalseとし、抽象関係比較 rval < lval の実行結果を r とする
  6. ReturnIfAbrupt(r)
  7. rundefined なら false を、 異なるなら r を返す
  1. RelationalExpression 評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. ShiftExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. LeftFirstfalseとし、抽象関係比較 rval < lval の実行結果を r とする
  6. ReturnIfAbrupt(r)
  7. rtrue または undefined なら、 false を、異なるなら true を返す
  1. RelationalExpression 評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. ShiftExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. 抽象関係比較 lval < rval の実行結果 を r とする
  6. ReturnIfAbrupt(r)
  7. rtrue または undefined なら、 false を、異なるなら true を返す
  1. RelationalExpression 評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. ShiftExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. ? InstanceofOperator(lval, rval)を返す
  1. RelationalExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. ShiftExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. Type(rval) が Object型でないなら、TypeError例外をスローする
  6. ? HasProperty(rval, ? ToPropertyKey(lval))を返す

12.10.4 ランタイムセマンティクス(Runtime Semantics): InstanceofOperator ( V, target )

抽象操作InstanceofOperatorは、ECMAScript値Vがオブジェクトtargetのインスタンスかどうかを判断する汎用アルゴリズムです。targetの@@hasinstanceメソッドを参照、または、@@hasinstanceメソッドが存在しない場合はVのプロトタイプチェーンにtarget"prototype"プロパティの値が存在するかどうかで判断します。 この抽象操作は、次の手順を実行します。

  1. Type(target) が Object型でないなら、TypeError例外をスローする
  2. ? GetMethod(target, @@hasInstance) を instOfHandler とする
  3. instOfHandlerundefined でないなら、
    1. ! ToBoolean(? Call(instOfHandler, target, « V »))を返す
  4. IsCallable(target) が false なら、TypeError例外をスローする
  5. ? OrdinaryHasInstance(target, V)を返す
4と5は、以前のエディションのECMAScriptとの互換性を提供します。以前は@@hasInstanceメソッドを使用してinstanceof演算子のセマンティクスを定義していませんでした。オブジェクトが@@hasInstanceを定義または継承しない場合、デフォルトのinstanceofセマンティクスを使用します。

12.11 等値演算子(Equality Operators)

等値演算子の評価結果は常にブール型であす。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]

12.11.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.11.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.11.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. EqualityExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. RelationalExpressionrref とする
  4. ? GetValue(rref) の評価結果を rval とする
  5. 抽象等値比較 rval == lval の実行結果を返す
  1. EqualityExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. RelationalExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. 抽象等値比較 rval == lval の実行結果を r とする
  6. ReturnIfAbrupt(r)
  7. rtrue なら、 false を、true を返す
  1. EqualityExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. RelationalExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. 厳密等値比較 rval === lval の実行結果を返す
  1. EqualityExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. RelationalExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. 厳密等値比較 rval === lval の実行結果を r とする
  6. Assert: r は通常の完了
  7. r.[[Value]] が true なら、 false を、 true を返す
上記の等値の定義より、

  • 文字列の比較は`${a}` == `${b}`によって強制できます
  • 数値比較は +a == +b によって強制できます
  • ブール比較は !a == !b によって強制できます
等値演算子は、次の不変条件を維持します。

  • A != B!(A == B) は同等です。
  • A == B は、ABの評価の順序を除いて、B == A と同等です。
等値演算子は常に推移的であるとは限りません。 たとえば、2つの異なるStringオブジェクトが同じString値を表しているとします。 ==演算子では、StringオブジェクトとString値は等しいと見なされます。しかしStringオブジェクト同士の比較は等しくありません。

例:

  • new String("a") == "a" と "a" == new String("a") は共に true
  • new String("a") == new String("a")false
文字列の比較は、コードユニット値のシーケンスに対して単純な同等性テストをおこないます。 Unicode仕様で定義されている、文字または文字列の同等性と照合順序の、より複雑で意味指向の定義は使用しません。 したがって、Unicode標準では等しい文字列値でも、等しくない結果となる可能性があります。 実際のところ、このアルゴリズムは、両方の文字列が正規化された形式であることを前提としています。

12.12 バイナリビット演算子(Binary Bitwise Operators)

構文:

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]

12.12.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.12.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.12.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

プロダクション AA @ B@はビット演算子の1つ)は、次のように評価されます。

  1. A の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. B の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. ? ToNumeric(lval) を lnum とする
  6. ? ToNumeric(rval) を rnum とする
  7. Type(lnum) と Type(rnum) が異なるなら TypeError例外をスローする
  8. Type(lnum) を T とする
  9. @& なら T::bitwiseAND(lnum, rnum) を返す
  10. @| なら、 T::bitwiseOR(lnum, rnum) を返す
  11. 9. 10. と異なるなら、
    1. Assert: @^
    2. T::bitwiseXOR(lnum, rnum) を返す

12.13 バイナリ論理演算子(Binary Logical Operators)

構文:

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]
&& または || 演算子によって生成される値は必ずしもブール型である必要はありません。 生成される値は、常に2つのオペランド式のいずれかの値になります。

12.13.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.13.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.13.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. LogicalANDExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. ! ToBoolean(lval) を lbool とする
  4. lboolfalse なら、lval を返す
  5. BitwiseORExpression の評価結果を rref とする
  6. ? GetValue(rref) を返す
  1. LogicalORExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. ! ToBoolean(lval) を lbool とする
  4. lbooltrue なら、lval を返す
  5. LogicalANDExpression の評価結果を rref とする
  6. ? GetValue(rref) を返す
  1. CoalesceExpressionHead の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. lvalundefinednull なら、
    1. BitwiseORExpression の評価結果を rref とする
    2. ? GetValue(rref) を返す
  4. lvalを返す

12.14 三項(条件)演算子(Conditional Operator) ( ? : )

構文:

ConditionalExpression[In, Yield, Await] :
ShortCircuitExpression[?In, ?Yield, ?Await]
ShortCircuitExpression[?In, ?Yield, ?Await] ?AssignmentExpression[+In, ?Yield, ?Await] :AssignmentExpression[?In, ?Yield, ?Await]
ConditionalExpressionの文法は、CおよびJavaと少し異なります。それぞれ、2番目の部分式をExpressionにすることができますが、3番目はConditionalExpressionに制限されます。 この違いは、割り当て式を条件のどちらのアームでも制御できるようにし、中央の式がコンマで混乱して役に立たないケースを排除するためです。

12.14.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.14.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.14.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. ShortCircuitExpression の評価結果を lref とする
  2. ! ToBoolean(? GetValue(lref)) を lval とする
  3. lvaltrue なら、
    1. 最初の AssignmentExpression の評価結果を trueRef とする
    2. ? GetValue(trueRef) を返す
  4. 3. でないなら
    1. 2番目の AssignmentExpression の評価結を falseRef とする
    2. ? GetValue(falseRef) を返す/li>

12.15 割り当て演算子(Assignment Operators)

構文:

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]
AssignmentOperator : どれかひとつ
*=/=%=+=-=<<=>>=>>>=&=^=|=**=

12.15.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

LeftHandSideExpressionObjectLiteral またはArrayLiteral の場合、次の早期エラールールが適用されます。

LeftHandSideExpressionObjectLiteral でも ArrayLiteral でもない場合、次の早期エラールールが適用されます。

  • LeftHandSideExpressionAssignmentTargetTypesimple でない場合、構文エラーになります。
  • LeftHandSideExpressionAssignmentTargetTypesimple でない場合、構文エラーになります。

12.15.2 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. true を返す
  1. false を返す

12.15.3 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.15.4 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. LeftHandSideExpressionObjectLiteralArrayLiteral でないなら、
    1. LeftHandSideExpression の評価結果を lref とする
    2. ReturnIfAbrupt(lref)
    3. IsAnonymousFunctionDefinition(AssignmentExpression ) と LeftHandSideExpressionIsIdentifierRef の両方が true なら、
      1. 引数 GetReferencedName(lref) を使用して AssignmentExpressionNamedEvaluationrval とする
    4. c. でないなら
      1. AssignmentExpression の評価結果を rref とする
      2. ? GetValue(rref) を rval とする
    5. ? PutValue(lref, rval)を実行
    6. rval を返す
  2. LeftHandSideExpression によってカバーされている AssignmentPatternassignmentPattern とする
  3. AssignmentExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. 引数として rval を使用して ? assignmentPatternDestructuringAssignmentEvaluation を実行
  6. rval を返す
  1. LeftHandSideExpression の評価結果を lref とする
  2. ? GetValue(lref) を lval とする
  3. AssignmentExpression の評価結果を rref とする
  4. ? GetValue(rref) を rval とする
  5. AssignmentOperator@= としたときの @ にあたる文字を op とする。
  6. lval op rval の適用結果を r とする
  7. ? PutValue(lref, r) を実行
  8. rを返す
strictモードコード内で割り当てが発生した場合、最初のアルゴリズムのステップ1.eまたは2番目のアルゴリズムのステップ7で lref の参照を解決できないと、ランタイムエラーになりReferenceError例外がスローされます。 LeftHandSideExpressionは、属性値{[[Writable]]:false}のデータプロパティ,属性値{[[Set]]:undefined}のアクセサプロパティ、またはIsExtensiblefalseを返すオブジェクト内で存在していないプロパティのため、参照できない場合があります。 IsExtensible述部が値falseを返すオブジェクトのプロパティ。 このような場合、TypeError例外がスローされます。

12.15.5 分割代入(Destructuring Assignment)

補足構文:

プロダクション AssignmentExpressionLeftHandSideExpression =AssignmentExpression の特定の状況におけるインスタンス処理では、次の文法を使用して、LeftHandSideExpressionの解釈を変更します。

AssignmentPattern[Yield, Await] :
ObjectAssignmentPattern[?Yield, ?Await]
ArrayAssignmentPattern[?Yield, ?Await]
ObjectAssignmentPattern[Yield, Await] :
{}
{AssignmentRestProperty[?Yield, ?Await] }
{AssignmentPropertyList[?Yield, ?Await] }
{AssignmentPropertyList[?Yield, ?Await] ,AssignmentRestProperty[?Yield, ?Await]opt }
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]

12.15.5.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

  • IdentifierReferenceAssignmentTargetTypesimple でないなら、構文エラーです。

LeftHandSideExpressionObjectLiteralArrayLiteral なら、 次の早期エラールールが適用されます。

LeftHandSideExpressionObjectLiteral でも ArrayLiteral でもない場合、次の早期エラールールが適用されます。

12.15.5.2 ランタイムセマンティクス(Runtime Semantics): DestructuringAssignmentEvaluation

引数 value を使用。

  1. ? RequireObjectCoercible(value) を実行する
  2. NormalCompletion(empty) を返す
  1. ? RequireObjectCoercible(value) を実行する
  2. 引数 value を使用して ? AssignmentPropertyListPropertyDestructuringAssignmentEvaluation を実行する
  3. NormalCompletion(empty) を返す
  1. ? GetIterator(value) を iteratorRecord とする
  2. ? IteratorClose(iteratorRecord, NormalCompletion(empty)) を返す
  1. ? GetIterator(value) を iteratorRecord とする
  2. 引数 iteratorRecord を使用して ElisionIteratorDestructuringAssignmentEvaluationresult とする
  3. iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, result) を返す
  4. result を返す
  1. ? GetIterator(value) を iteratorRecord とする
  2. Elision が存在するなら、
    1. 引数 iteratorRecord を使用して ElisionIteratorDestructuringAssignmentEvaluationstatus とする
    2. status突然の完了 なら、
      1. Assert: iteratorRecord.[[Done]] は true
      2. Completion(status) を返す
  3. 引数 iteratorRecord を使用してof AssignmentRestElementIteratorDestructuringAssignmentEvaluationresult とする
  4. iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, result)を返す
  5. result を返す
  1. ? GetIterator(value) を iteratorRecord とする
  2. 引数 iteratorRecord を使用して AssignmentElementList IteratorDestructuringAssignmentEvaluationresult とする
  3. iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, result) を返す
  4. result を返す
  1. ? GetIterator(value) を iteratorRecord とする
  2. 引数 iteratorRecord を使用して AssignmentElementListIteratorDestructuringAssignmentEvaluationstatus とする
  3. status突然の完了 なら、
    1. iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, status)を返す
    2. Completion(status) を返す
  4. Elision が存在するなら、
    1. 引数 iteratorRecord を使用して ElisionIteratorDestructuringAssignmentEvaluation の実行結果を status にセットする
    2. status突然の完了 なら、
      1. Assert: iteratorRecord.[[Done]] は true
      2. Completion(status) を返す
  5. AssignmentRestElement が存在なら、
    1. 引数 iteratorRecord を使用して AssignmentRestElementIteratorDestructuringAssignmentEvaluation の実行結果を status にセットする
  6. iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, status)を返す
  7. Completion(status) を返す
  1. ? RequireObjectCoercible(value) を実行する
  2. 空の新規ListexcludedNames とする
  3. 引数 valueexcludedNames を使用して AssignmentRestProperty RestDestructuringAssignmentEvaluation の実行結果を返す
  1. ? RequireObjectCoercible(value) を実行する
  2. 引数 value を使用して ? AssignmentPropertyList PropertyDestructuringAssignmentEvaluation excludedNames とする
  3. 引数 valueexcludedNames を使用して AssignmentRestPropertyRestDestructuringAssignmentEvaluation の実行結果を返す

12.15.5.3 ランタイムセマンティクス(Runtime Semantics): PropertyDestructuringAssignmentEvaluation

引数 value を使用。

次の操作は、すべての非構造化プロパティ名のリストを収集します。
  1. 引数 value を使用して AssignmentPropertyList? PropertyDestructuringAssignmentEvaluationpropertyNames とする
  2. 引数 value を使用して AssignmentProperty? PropertyDestructuringAssignmentEvaluationnextNames とする
  3. propertyNames の最後に nextNames の各アイテムを追加する
  4. propertyNames を返す
  1. IdentifierReferenceStringValueP とする
  2. ? ResolveBinding(P) を lref とする
  3. ? GetV(value, P) を v とする
  4. Initializeropt が 存在し、 vundefined なら、
    1. IsAnonymousFunctionDefinition(Initializer ) が true なら、
      1. 引数 P を使用して InitializerNamedEvaluation  の実行結果を v にセットする
    2. a. でないなら、
      1. Initializer の評価結果を defaultValue とする
      2. ? GetValue(defaultValue) を v にセットする
  5. ? PutValue(lref, v) を実行する
  6. P を含む新しいリストを返す
  1. PropertyName の評価結果を name とする
  2. ReturnIfAbrupt(name)
  3. 引数 valuename を使用して ? AssignmentElementKeyedDestructuringAssignmentEvaluation を実行する
  4. name を含む新しいリストを返す

12.15.5.4 ランタイムセマンティクス(Runtime Semantics): RestDestructuringAssignmentEvaluation

引数 valueexcludedNames を使用。

  1. DestructuringAssignmentTarget の評価結果を lref とする
  2. ReturnIfAbrupt(lref)
  3. OrdinaryObjectCreate(%Object.prototype%) を restObj とする
  4. ? CopyDataProperties(restObj, value, excludedNames) を実行する
  5. PutValue(lref, restObj) を返す

12.15.5.5 ランタイムセマンティクス(Runtime Semantics): IteratorDestructuringAssignmentEvaluation

引数 iteratorRecord を使用。

  1. 引数 iteratorRecord を使用して AssignmentElisionElementIteratorDestructuringAssignmentEvaluation の実行結果を返す
  1. 引数 iteratorRecord を使用して ? AssignmentElementListIteratorDestructuringAssignmentEvaluation を実行する
  2. 引数 iteratorRecord を使用して AssignmentElisionElementIteratorDestructuringAssignmentEvaluation の実行結果を返す
  1. 引数 iteratorRecord を使用して AssignmentElementIteratorDestructuringAssignmentEvaluation の実行結果を返す
  1. 引数 iteratorRecord を使用して ? ElisionIteratorDestructuringAssignmentEvaluation を実行する
  2. 引数 iteratorRecord を使用して AssignmentElementIteratorDestructuringAssignmentEvaluation の実行結果を返す
  1. iteratorRecord.[[Done]] が false なら、
    1. IteratorStep(iteratorRecord) を next とする
    2. next が an 突然の完了 なら、trueiteratorRecord.[[Done]] にセット
    3. ReturnIfAbrupt(next)
    4. nextfalse なら、trueiteratorRecord.[[Done]] にセット
  2. NormalCompletion(empty) を返す
  1. 引数 iteratorRecord を使用して ? ElisionIteratorDestructuringAssignmentEvaluation を実行する
  2. iteratorRecord.[[Done]] が false なら、
    1. IteratorStep(iteratorRecord) を next とする
    2. next突然の完了 なら、trueiteratorRecord.[[Done]] にセット
    3. ReturnIfAbrupt(next)
    4. nextfalse なら、trueiteratorRecord.[[Done]] にセット
  3. NormalCompletion(empty) を返す
  1. DestructuringAssignmentTargetObjectLiteralArrayLiteral でないなら、
    1. DestructuringAssignmentTarget の評価結果を lref とする
    2. ReturnIfAbrupt(lref)
  2. iteratorRecord.[[Done]] が false なら、
    1. IteratorStep(iteratorRecord) を next とする
    2. next が an 突然の完了 なら、trueiteratorRecord.[[Done]] にセット
    3. ReturnIfAbrupt(next)
    4. nextfalse なら、、trueiteratorRecord.[[Done]] にセット
    5. d. でないなら、
      1. IteratorValue(next) を value とする
      2. value突然の完了 なら、trueiteratorRecord.[[Done]] にセット
      3. ReturnIfAbrupt(value)
  3. iteratorRecord.[[Done]] が true なら、undefinedvalue とする
  4. Initializer が 存在し、 valueundefined なら、
    1. IsAnonymousFunctionDefinition(Initializer ) と DestructuringAssignmentTargetIsIdentifierRef の両方が true なら、
      1. 引数 GetReferencedName(lref) を使用して InitializerNamedEvaluationv とする
    2. a. でないなら、
      1. Initializer の評価結果を defaultValue とする
      2. ? GetValue(defaultValue) を v とする
  5. 4. でないなら、valuev とする
  6. DestructuringAssignmentTargetObjectLiteralArrayLiteral なら、
    1. DestructuringAssignmentTarget によってカバーされている AssignmentPatternnestedAssignmentPattern とする
    2. 引数 v を使用して nestedAssignmentPatternDestructuringAssignmentEvaluation の実行結果を返す
  7. ? PutValue(lref, v) を返す
左から右への評価順序は、イテレータにアクセスする前、またはイニシャライザを評価する前に、分割パターンではないDestructuringAssignmentTargetを評価することによって維持されます。
  1. DestructuringAssignmentTargetObjectLiteralArrayLiteral でないなら、
    1. DestructuringAssignmentTarget の評価結果を lref とする
    2. ReturnIfAbrupt(lref)
  2. ! ArrayCreate(0) を A とする
  3. 0n とする
  4. iteratorRecord.[[Done]] が false の間繰り返し
    1. IteratorStep(iteratorRecord) を next とする
    2. next突然の完了 なら、trueiteratorRecord.[[Done]] にセット
    3. ReturnIfAbrupt(next)
    4. nextfalse なら、trueiteratorRecord.[[Done]] にセット
    5. d. でないなら、
      1. IteratorValue(next) を nextValue とする
      2. nextValue突然の完了 なら、trueiteratorRecord.[[Done]] にセット
      3. ReturnIfAbrupt(nextValue)
      4. ! CreateDataPropertyOrThrow(A, ! ToString(n), nextValue) を実行する
      5. n + 1n にセットする
  5. DestructuringAssignmentTargetObjectLiteralArrayLiteral でないなら、
    1. ? PutValue(lref, A) を返す
  6. DestructuringAssignmentTarget によってカバーされている AssignmentPatternnestedAssignmentPattern とする
  7. 引数 A を使用して nestedAssignmentPatternDestructuringAssignmentEvaluation の実行結果を返す

12.15.5.6 ランタイムセマンティクス(Runtime Semantics): KeyedDestructuringAssignmentEvaluation

引数 valuepropertyName を使用。

  1. DestructuringAssignmentTargetObjectLiteralArrayLiteral でないなら、
    1. DestructuringAssignmentTarget の評価結果を lref とする
    2. ReturnIfAbrupt(lref)
  2. ? GetV(value, propertyName) を v とする
  3. Initializer が存在し、vundefined なら、
    1. IsAnonymousFunctionDefinition(Initializer ) と DestructuringAssignmentTargetIsIdentifierRef の両方が true なら、
      1. 引数 GetReferencedName(lref) を使用して InitializerNamedEvaluationrhsValue とする
    2. a. でないなら、
      1. Initializer の評価結果を defaultValue とする
      2. ? GetValue(defaultValue) を rhsValue とする
  4. 3. でないなら、 vrhsValue とする
  5. DestructuringAssignmentTargetObjectLiteralArrayLiteral なら、
    1. DestructuringAssignmentTarget によってカバーされている AssignmentPatternassignmentPattern とする
    2. 引数 rhsValue を使用して assignmentPatternDestructuringAssignmentEvaluation の実行結果を返す
  6. ? PutValue(lref, rhsValue) を返す

12.16 カンマ演算子(Comma Operator) ( , )

構文:

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

12.16.1 静的セマンティクス(Static Semantics): IsFunctionDefinition

  1. false を返す

12.16.2 静的セマンティクス(Static Semantics): AssignmentTargetType

  1. invalid を返す

12.16.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)

  1. Expression の評価結果を lref とする
  2. ? GetValue(lref) を実行する
  3. AssignmentExpression の評価結果を rref とする
  4. ? GetValue(rref) を返す
GetValueは、観察可能な副作用がある可能性があるため、その値が使用されていない場合でも呼び出す必要があります。