12.1 識別子(Identifiers)
構文:
12.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- このプロダクションに一致するコードがstrictモードコードに含まれ、IdentifierのStringValueが"eval"または"arguments"である場合、構文エラーです。
- このプロダクションと一致するコードがstrictモードコードに含まれている場合、構文エラーです。
- このプロダクションに[Yield]パラメータがある場合、構文エラーです。
- このプロダクションに[Await]パラメータがある場合、構文エラーです。
- このプロダクションに[Yield]パラメータがあり、IdentifierのStringValue が "yield" の場合は、構文エラーです。
- このプロダクションに[Await]パラメータがあり、IdentifierのStringValue が "await" の場合は、構文エラーです。
- このフレーズがstrictモードコードに含まれ、IdentifierNameのStringValueが"implements"、 "interface"、 "let"、 "package"、 "private"、 "protected"、 "public"、 "static"、 "yield" の場合は、構文エラーです。
- 構文文法のゴールシンボルがModuleで、IdentifierNameのStringValueが"await"の場合は、構文エラーです。
- IdentifierName
のStringValueが、"yield"または"await"を除いて、ReservedWordのStringValueと同じ値である場合は、構文エラーです。
12.1.2 静的セマンティクス(Static Semantics):BoundNames
- IdentifierのStringValueを含む新しいリストを返す
- "yield"を含む新しいリストを返す
- "await"を含む新しいリストを返す
12.1.3 静的セマンティクス(Static Semantics):AssignmentTargetType
- IdentifierReferenceがstrictモードコードに含まれていて、IdentifierのStringValueが"eval"または"arguments"の場合、invalidを返す。
- simpleを返す
- simpleを返す
- simpleを返す
12.1.4 静的セマンティクス(Static Semantics):StringValue
- "yield"を返す
- "await"を返す
- IdentifierNameのStringValueを返す
12.1.5 ランタイムセマンティクス(Runtime Semantics):BindingInitialization
パラメータvalue と environmentを使用します。
- IdentifierのStringValue を name とする
- ? InitializeBoundName(name, value, environment)を返す
- ? InitializeBoundName("yield", value, environment)を返す
- ? InitializeBoundName("await", value, environment)を返す
12.1.5.1 ランタイムセマンティクス(Runtime Semantics): InitializeBoundName ( name, value, environment )
- Assert: Type(name) は String型
- environment が undefined でないなら、
- environment の EnvironmentRecord を env とする
- env.InitializeBinding(name, value)を実行
- NormalCompletion(undefined)を返す
- Else,
- ResolveBinding(name) を lhs とする
- ? PutValue(lhs, value)を返す
12.1.6 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ? ResolveBinding(IdentifierのStringValue )を返す
- ? ResolveBinding( "yield" )を返す
- ? ResolveBinding( "await" )を返す
12.2 一次式(Primary Expression)
構文:
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]
(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の解釈は、次の文法を使用して改善されます。
12.2.1 セマンティクス(Semantics)
12.2.1.1 静的セマンティクス(Static Semantics): CoveredParenthesizedExpression
12.2.1.2 静的セマンティクス(Static Semantics): HasName
- CoverParenthesizedExpressionAndArrowParameterList の CoveredParenthesizedExpression を expr とする
- expr のIsFunctionDefinitionが false なら、 false を返す
- expr の HasName を返す
12.2.1.3 静的セマンティクス(Static Semantics): IsFunctionDefinition
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
RegularExpressionLiteral
TemplateLiteral
- false を返す
- CoverParenthesizedExpressionAndArrowParameterList の CoveredParenthesizedExpression を expr とする
- expr の IsFunctionDefinition を返す
12.2.1.4 静的セマンティクス(Static Semantics): IsIdentifierRef
- true を返す
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
- false を返す
12.2.1.5 静的セマンティクス(Static Semantics): AssignmentTargetType
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
- invalid を返す
- CoverParenthesizedExpressionAndArrowParameterList の CoveredParenthesizedExpression を expr とする
- expr の AssignmentTargetType を返す
12.2.2 thisキーワード(The this Keyword)
12.2.2.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ? ResolveThisBinding ()を返す
12.2.3 識別子参照(Identifier Reference)
IdentifierReferenceについては、12.1を参照
12.2.4 リテラル(Literals)
構文:
12.2.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- null を返す
- BooleanLiteral が falseトークンなら、 false を返す
- BooleanLiteral が trueトークンなら、 true を返す
- 11.8.3で定義されているNumericLiteralのNumericValueを返す
- 11.8.4.1で定義されているStringLiteralのStringValueを返す
12.2.5 配列初期化子(Array Initializer)
配列要素は、要素リストの最初、中間、最後を省略できます。 要素リストのカンマの前にAssignmentExpression(つまり、最初または別のカンマの後にあるカンマ)がない場合は、欠落している配列要素が配列の長さに影響し、後続要素のインデックスが増加させます。 省略された配列要素は定義されていません。 要素が配列の最後で省略されている場合、その要素は配列の長さに影響しません。
構文:
[Elisionopt ]
[ElementList[?Yield, ?Await] ]
[ElementList[?Yield, ?Await] ,Elisionopt ]
Elisionopt AssignmentExpression[+In, ?Yield, ?Await]
Elisionopt SpreadElement[?Yield, ?Await]
ElementList[?Yield, ?Await] ,Elisionopt AssignmentExpression[+In, ?Yield, ?Await]
ElementList[?Yield, ?Await] ,Elisionopt SpreadElement[?Yield, ?Await]
12.2.5.1 ランタイムセマンティクス(Runtime Semantics): ArrayAccumulation
パラメータ array と nextIndexを使用します。
- 引数 array と nextIndex + 1 を使用して Elision の ArrayAccumulationを実行した結果を返す
- Elision が存在するなら、
- 引数 array と nextIndex を使用して Elision のArrayAccumulationを実行した結果 を nextIndex にセットする
- ReturnIfAbrupt(nextIndex)
- AssignmentExpression の評価結果 を initResult とする
- ? GetValue(initResult) を initValue とする
- ! CreateDataPropertyOrThrow(array, ! ToString(nextIndex), initValue) を created とする
- nextIndex + 1 を返す
- Elision が存在するなら、
- 引数 array と nextIndex を使用してElision のArrayAccumulationを実行した結果 を nextIndex にセットする
- ReturnIfAbrupt(nextIndex)
- 引数 array と nextIndex を使用して SpreadElement の ArrayAccumulation を実行した結果を返す
- 引数 array と nextIndex を使用してElementListのArrayAccumulationを実行した結果 を nextIndex にセットする
- ReturnIfAbrupt(nextIndex)
- Elision が存在するなら、
- 引数 array と nextIndex を使用してElisionのArrayAccumulationを実行した結果 を nextIndex にセットする
- ReturnIfAbrupt(nextIndex)
- AssignmentExpressionの評価結果 を initResult とする
- ? GetValue(initResult) を initValue とする
- ! CreateDataPropertyOrThrow(array, !ToString(nextIndex), initValue) を created とする
- nextIndex + 1を返す
- 引数 array と nextIndex を使用してElementListの ArrayAccumulationを実行した結果を nextIndex にセットする
- ReturnIfAbrupt(nextIndex)
- Elision が存在するなら、
- 引数arrayとnextIndexを使用してElisionのArrayAccumulationを実行した結果 を nextIndex にセットする
- ReturnIfAbrupt(nextIndex)
- 引数 array と nextIndex を使用して SpreadElement の ArrayAccumulation を実行した結果を返す
- AssignmentExpression の評価結果 を spreadRef とする
- ? GetValue(spreadRef) を spreadObj とする
- ? GetIterator(spreadObj) を iteratorRecord とする
- 以下を繰り返す
- ? IteratorStep(iteratorRecord) を next とする
- next が false なら、nextIndex を返す
- ? IteratorValue(next) を nextValue とする
- ! CreateDataPropertyOrThrow(array, !ToString(nextIndex), nextValue)を実行
- nextIndex + 1 を nextIndex にセット
12.2.5.2 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ! ArrayCreate(0) を array とする
- Elision が存在するなら、
- 引数 array と 0 を使用して Elision の ArrayAccumulation を実行した結果を len とする
- ReturnIfAbrupt(len)
- arrayを返す
- ! ArrayCreate(0) を array とする
- 引数 array と 0 を使用して ElementList のt ArrayAccumulation を実行した結果を len とする
- ReturnIfAbrupt(len)
- arrayを返す
- ! ArrayCreate(0) を array とする
- 引数 array と 0 を使用して ElementList の ArrayAccumulation を実行した結果を nextIndex とする
- ReturnIfAbrupt(nextIndex)
- Elision が存在するなら、
- 引数 array と nextIndex を使用して Elision の ArrayAccumulation を実行した結果 を len とする
- ReturnIfAbrupt(len)
- arrayを返す
12.2.6 オブジェクト初期化子(Object Initializer)
構文:
{}
{PropertyDefinitionList[?Yield, ?Await] }
{PropertyDefinitionList[?Yield, ?Await] ,}
PropertyDefinition[?Yield, ?Await]
PropertyDefinitionList[?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]
IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]
12.2.6.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- MethodDefinitionのHasDirectSuperがtrueの場合は、構文エラーです。
ObjectLiteralプロダクションはObjectAssignmentPatternのカバー文法としても使用され、CoverParenthesizedExpressionAndArrowParameterListの一部として認識される場合があります。 ObjectLiteralがObjectAssignmentPatternを必要とするコンテキストで表示される場合、以下の早期エラールールは適用されません。 さらに、CoverParenthesizedExpressionAndArrowParameterListまたはCoverCallExpressionAndAsyncArrowHeadの最初の解析時、これらは適用されません。
- コードがこのプロダクションと一致する場合は、常に構文エラーをスローします。
12.2.6.2 静的セマンティクス(Static Semantics): ComputedPropertyContains
パラメータ symbol を使用。
- false を返す
- ComputedPropertyName Contains symbolの結果を返す
12.2.6.3 静的セマンティクス(Static Semantics): Contains
パラメータ symbol を使用。
- symbol MethodDefinition なら、 true を返す
- 引数symbolを使用して MethodDefinitionのComputedPropertyContainsの結果を返す
- symbol が ReservedWord , false を返す.
- symbol が Identifier で、symbol の StringValue がIdentifierName の StringValue と同じなら、true をす
- false を返す
12.2.6.4 静的セマンティクス(Static Semantics): IsComputedPropertyKey
- false を返す
- true を返す
12.2.6.5 静的セマンティクス(Static Semantics): PropName
- IdentifierReference の StringValue を返す
- emptyを返す
- PropertyName の PropName を返す
- IdentifierName の StringValue を返す
- コードユニットがStringLiteralのSVであるString値を返す
- NumericLiteral の NumericValue を nbr とする
- ! ToString(nbr)を返す
- emptyを返す
12.2.6.6 静的セマンティクス(Static Semantics): PropertyNameList
- PropertyDefinition の PropName が empty なら、 空の新規 List を返す
- PropertyDefinition の PropName を含む新規 Listを返す
- PropertyDefinitionList の PropertyNameList を list とする
- PropertyDefinition の PropName が empty なら、 list を返す
- PropertyDefinition の PropName を list の最後に追加する
- listを返す
12.2.6.7 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- OrdinaryObjectCreate(%Object.prototype%)を返す
- OrdinaryObjectCreate(%Object.prototype%) を obj とする
- 引数 obj と true を使用して ? PropertyDefinitionList の PropertyDefinitionEvaluation を実行
- obj を返す
- IdentifierName の StringValue を返す
- コードユニットがStringLiteralのSVであるString値を返す
- NumericLiteral の NumericValue を nbr とする
- ! ToString(nbr) を返す
- AssignmentExpression の評価結果を exprValue とする
- ? GetValue(exprValue) を propName とする
- ? ToPropertyKey(propName) を返す
12.2.6.8 ランタイムセマンティクス(Runtime Semantics): PropertyDefinitionEvaluation
パラメータ object と enumerable を使用。
- 引数object と enumerable を使用して、? PropertyDefinitionList の PropertyDefinitionEvaluation を実行
- 引数object と enumerable を使用して、PropertyDefinition の PropertyDefinitionEvaluation の実行結果を返す
- AssignmentExpression の評価結果 を exprValue とする
- ? GetValue(exprValue) を fromValue とする
- 空の新規List を excludedNames とする
- ? CopyDataProperties(object, fromValue, excludedNames)を返す
- IdentifierReference の StringValue を propName とする
- IdentifierReference の評価結果を exprValue とする
- ? GetValue(exprValue) を propValue とする
- Assert: enumerable は true
- Assert: objectは、構成不可能なプロパティを持っていない、拡張可能な通常のオブジェクト
- ! CreateDataPropertyOrThrow(object, propName, propValue)を返す
- PropertyName の評価結果を propKey とする
- ReturnIfAbrupt(propKey)
- IsAnonymousFunctionDefinition(AssignmentExpression ) が true なら、
- 引数 propKey を使用して、 AssignmentExpression の NamedEvaluation を propValue とする
- Else,
- AssignmentExpression の評価結果を exprValueRef とする
- ? GetValue(exprValueRef) を propValue とする
- Assert: enumerable は true
- Assert: objectは、構成不可能なプロパティを持っていない、拡張可能な通常のオブジェクト
- ! CreateDataPropertyOrThrow(object, propKey, propValue)を返す
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)
- IsValidRegularExpressionLiteral(RegularExpressionLiteral) がfalseなら、構文エラー
12.2.8.2 静的セマンティクス(Static Semantics): IsValidRegularExpressionLiteral ( literal )
抽象演算IsValidRegularExpressionLiteralは、引数literalが有効な正規表現リテラルであるかどうかを判別します。 次の手順を実行します。
- Assert: literal は RegularExpressionLiteral
- literal の FlagText に g、i、m、s、u、y 以外のコードポイントが含まれている、または同じコードポイントが複数含まれているなら、false を返す
- literal の BodyText を P とする
- literal の FlagText に u が含まれているなら、
- UTF16Encode(P) を stringValue とする
- stringValue の各16ビット要素をUnicode BMPコードポイントとして解釈した結果のコードポイントのシーケンス を pText とする。要素にUTF-16デコードは適用されない。
- 21.2.1の文法を使用して>pTextを解析する。その際のゴールシンボル は Pattern[~U, ~N]。解析の結果に GroupName が含まれているなら、 ゴールシンボル Pattern[~U, +N] で再解析する。 P が文法に準拠していない、P のいずれかの要素が解析で一致しない、または早期エラー条件が存在するなら false を、 それ以外なら、true を返す
12.2.8.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ! UTF16Encode(BodyText of RegularExpressionLiteral ) を pattern とする
- ! UTF16Encode( RegularExpressionLiteral の FlagText ) を flags とする
- RegExpCreate(pattern, flags)を返す
12.2.9 テンプレートリテラル(Template Literals)
構文:
NoSubstitutionTemplate
SubstitutionTemplate[?Yield, ?Await, ?Tagged]
TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged]
TemplateTail
TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail
TemplateMiddle Expression[+In, ?Yield, ?Await]
TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]
12.2.9.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- [Tagged]パラメーターが設定されていないとき、NoSubstitutionTemplate に NotEscapeSequence が含まれている場合は、構文エラーです
- 引数 false を使用して TemplateLiteral の TemplateStrings の 結果 の 要素数が 232-1より大きいなら、構文エラーです。
TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged]
- [Tagged]パラメーターが設定されていないとき、TemplateHead に NotEscapeSequence が含まれている場合は、構文エラーです
- [Tagged]パラメーターが設定されていないとき、 TemplateTail に NotEscapeSequence が含まれている場合は、構文エラーです
TemplateMiddle Expression[+In, ?Yield, ?Await]
TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]
- [Tagged]パラメーターが設定されていないとき、 TemplateMiddle に NotEscapeSequence が含まれている場合は、構文エラーです
12.2.9.2 静的セマンティクス(Static Semantics): TemplateStrings
パラメータ raw を使用。
- raw が false なら、
- NoSubstitutionTemplate の TV を string とする
- 1. でないなら、
- NoSubstitutionTemplate の TRV を string とする
- stringを含む単一のList を返す
- raw が false なら、
- TemplateHead のTV を head とする
- 1.でないなら
- TemplateHead のTRV を head とする
- 引数 raw を使用して TemplateSpans の TemplateStrings を tail とする
- head の後に、 tail の内容が順番に続く List を返す
- raw が false なら、
- TemplateTail のTVを tail とする
- 1.でないなら
- TemplateTail のTRVを tail とする
- tail を含む単一のList を返す
- 引数 raw を使用して TemplateMiddleList の TemplateStrings を middle とする
- raw が false なら、
- TemplateTail のTVを tail とする
- 2.でないなら
- TemplateTail のTRVを tail とする
- middle の後に tail が順番に続く List を返す
- raw が false なら、
- TemplateMiddle のTVを string とする
- 1.でないなら
- TemplateMiddle のTRVを string とする
- string を含む単一の List を返す
- 引数 raw を使用して TemplateMiddleList の TemplateStrings を front とする
- raw が false なら、
- TemplateMiddle のTVを last とする
- 2.でないなら
- TemplateMiddle のTRVを last とする
- frontの最後に、last を追加する
- frontを返す
12.2.9.3 ランタイムセマンティクス(Runtime Semantics): ArgumentListEvaluation
- TemplateLiteral を templateLiteral とする
- GetTemplateObject(templateLiteral) を siteObj とする
- siteObjを含むListを返す
- TemplateLiteral を templateLiteral とする
- GetTemplateObject(templateLiteral) を siteObj とする
- Expression の評価結果を firstSubRef とする
- ? GetValue(firstSubRef) を firstSub とする
- ? TemplateSpans の SubstitutionEvaluation を restSub とする
- Assert: restSub は List
- 最初の要素が siteObj、2番目が firstSub、次がrestSubであるListを返す。restSub には要素を含めることができない。
12.2.9.4 ランタイムセマンティクス(Runtime Semantics): GetTemplateObject ( templateLiteral )
抽象操作GetTemplateObjectは、パースノードtemplateLiteralを引数として呼び出されます。 次の手順を実行します。
- 引数 true を使用して templateLiteral の TemplateStrings を rawStrings とする
- 現在のレルムレコード を realm とする
- realm.[[TemplateMap]] を templateRegistry とする
- For each element e of templateRegistry の要素を e とし、各 e 毎に、
- e.[[Site]] が templateLiteral と 同じパースノード なら、
- e.[[Array]]を返す
- e.[[Site]] が templateLiteral と 同じパースノード なら、
- 引数 false を使用して templateLiteral の TemplateStrings を cookedStrings とする
- List である cookedStrings の要素数 を count とする
- Assert: count ≦ 232 - 1
- ! ArrayCreate(count) を template とする
- ! ArrayCreate(count) を rawObj とする
- 0 を index とする
- index < count の間繰り返す
- ! ToString(index) を prop とする
- cookedStrings[index] のString値を cookedValue とする
- template.[[DefineOwnProperty]](prop,プロパティ記述子 { [[Value]]: cookedValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }) を呼び出す
- rawStrings[index] のString値を rawValue とする
- rawObj.[[DefineOwnProperty]](prop,プロパティ記述子 { [[Value]]: rawValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false })を呼び出す
- index + 1 を index にセットする
- SetIntegrityLevel(rawObj, frozen)を実行
- template.[[DefineOwnProperty]]("raw",プロパティ記述子 { [[Value]]: rawObj, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false })を呼び出す
- SetIntegrityLevel(template, frozen)を実行
- templateRegistryにRecord { [[Site]]: templateLiteral, [[Array]]: template } を追加
- templateを返す
12.2.9.5 ランタイムセマンティクス(Runtime Semantics): SubstitutionEvaluation
- 空の新規Listを返す
- TemplateMiddleList の SubstitutionEvaluation の結果を返す
- Expression の評価結果を subRef とする
- ? GetValue(subRef) を sub とする
- sub のみを含む List を返す
- ? TemplateMiddleList の SubstitutionEvaluation を preceding とする
- Expression の評価結果 を nextRef とする
- ? GetValue(nextRef) を next とする
- Listである preceding の 最後に next を追加する
- preceding を返す
12.2.9.6 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- コードユニットがNoSubstitutionTemplateのTVの要素である文字列値を返す(11.8.6参照)
- the TV of TemplateHead のTVを head とする(11.8.6参照)
- Expression の評価結果を subRef とする
- ? GetValue(subRef) を sub とする
- ? ToString(sub) を middle とする
- tail とする
- ReturnIfAbrupt(tail)
- head、 middle、tail の文字列連結を返す
- TemplateTail のTVを tail とする(11.8.6参照)
- tail のコードユニットで構成されるString値を返す
- TemplateMiddleList の評価結果 を head とする
- ReturnIfAbrupt(head)
- the TV of TemplateTail のTVを tail とする(11.8.6参照)
- head と tail の文字列連結を返す
- the TV of TemplateMiddle のTVを head とする(11.8.6参照)
- Expression の評価結果を subRef とする
- ? GetValue(subRef) を sub とする
- ? ToString(sub) を middle とする
- head のコードユニットと、それに続く middle の要素で構成されるコードユニットのシーケンスを返す
- TemplateMiddleList の評価結果を rest とする
- ReturnIfAbrupt(rest)
- the TV of TemplateMiddle のTVを middle とする(11.8.6参照)/li>
- Expression の評価結果を subRef とする
- ? GetValue(subRef) を sub とする
- ? ToString(sub) を last とする
- rest、middle、lastの要素で構成されるコードユニットのシーケンスを返す
12.2.10 グループ化演算子(The Grouping Operator)
12.2.10.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- CoverParenthesizedExpressionAndArrowParameterList が ParenthesizedExpression をカバーしていないなら、構文エラーです
- ParenthesizedExpression と その派生プロダクションの早期エラールールは、CoverParenthesizedExpressionAndArrowParameterList の CoveredParenthesizedExpression にも適用されます。
12.2.10.2 静的セマンティクス(Static Semantics): IsFunctionDefinition
- Expression の IsFunctionDefinition を返す
12.2.10.3 静的セマンティクス(Static Semantics): AssignmentTargetType
- Expression の AssignmentTargetType を返す
12.2.10.4 ランタイムセマンティクス(Runtime Semantics): NamedEvaluation
引数 name を使用。
- of CoverParenthesizedExpressionAndArrowParameterList のCoveredParenthesizedExpression を expr とする
- 引数 name を使用して expr の NamedEvaluation を実行した結果を返す
- Assert: IsAnonymousFunctionDefinition(Expression ) は true
- 引数 name を使用して Expression の NamedEvaluation を実行した結果返す
12.2.10.5 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- of CoverParenthesizedExpressionAndArrowParameterList の CoveredParenthesizedExpression を expr とする
- expr の評価結果を返す
- Expression の評価結果を返す。これはReference型の場合がある。
12.3 左辺式(Left-Hand-Side Expressions)
構文:
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]
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]
AssignmentExpression[+In, ?Yield, ?Await]
...AssignmentExpression[+In, ?Yield, ?Await]
ArgumentList[?Yield, ?Await] ,AssignmentExpression[+In, ?Yield, ?Await]
ArgumentList[?Yield, ?Await] ,...AssignmentExpression[+In, ?Yield, ?Await]
MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await]
CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await]
OptionalExpression[?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]
NewExpression[?Yield, ?Await]
CallExpression[?Yield, ?Await]
OptionalExpression[?Yield, ?Await]
補足構文:
12.3.1 静的セマンティクス(Static Semantics)
12.3.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- コードがこのプロダクションに一致する場合、構文エラーです。
a?.b
`c`
上の2行を2つのステートメントとして解釈されるようにします。オプションの連鎖なしで同様のコードとの一貫性を維持するためです。
a.b
`c`
これは有効なステートメントであり、自動セミコロン挿入が適用されません。
12.3.1.2 静的セマンティクス(Static Semantics): CoveredCallExpression
- CoverCallExpressionAndAsyncArrowHead によってカバーされている CallMemberExpression を返す
12.3.1.3 静的セマンティクス(Static Semantics): Contains
引数 symbol を使用。
- MemberExpression の Contains symbol が true なら、 true を返す
- symbol が ReservedWord なら false を返す
- symbol が Identifier で symbol の StringValue が IdentifierName のStringValue と同じ値なら、 true を返す
- false を返す.
- symbol が ReservedWord super なら、 true を返す
- symbol が ReservedWord なら false を返す
- symbol が Identifier で symbol の StringValue が IdentifierName の StringValue と同じ値なら、 true を返す
- false を返す
- CallExpression Contains symbol が true なら、 true を返す
- symbol が ReservedWord なら false を返す
- symbol が Identifier で symbol の StringValue が IdentifierName の StringValue と同値なら、 true を返す
- false を返す
- symbol が ReservedWord なら false を返す
- symbol が Identifier で symbol の StringValue が IdentifierName の StringValue と同値なら、 true を返す
- false を返す
- OptionalChain Contains symbol が true なら、 true を返す
- symbol が ReservedWord なら false を返す
- symbol が Identifier で symbol の StringValue が IdentifierName の StringValue と同値なら、 true を返す
- false を返す
12.3.1.4 静的セマンティクス(Static Semantics): IsFunctionDefinition
MemberExpression [Expression ]
MemberExpression .IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
newMemberExpression Arguments
- false を返す
12.3.1.5 静的セマンティクス(Static Semantics): IsDestructuring
- PrimaryExpression が ObjectLiteral か ArrayLiteral なら true を返す
- false を返す.
MemberExpression [Expression ]
MemberExpression .IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
newMemberExpression Arguments
- false を返す
12.3.1.6 静的セマンティクス(Static Semantics): IsIdentifierRef
MemberExpression [Expression ]
MemberExpression .IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
newMemberExpression Arguments
- false を返す
12.3.1.7 静的セマンティクス(Static Semantics): AssignmentTargetType
- simpleを返す
CoverCallExpressionAndAsyncArrowHead
SuperCall
ImportCall
CallExpression Arguments
CallExpression TemplateLiteral
- invalidを返す
12.3.2 プロパティアクセサー(Property Accessors)
MemberExpression . IdentifierName
CallExpression . IdentifierName
または角括弧表記でアクセスします。
MemberExpression [ Expression ]
CallExpression [ Expression ]
ドット表記は、次の構文変換によって説明されます。
MemberExpression . IdentifierName
動作は次と同じです。
MemberExpression [ <identifier-name-string> ]
ここで、<identifier-name-string>は、IdentifierName の StringValue を評価した結果です。
同様に
CallExpression . IdentifierName
動作は次と同じです。
CallExpression [ [ <identifier-name-string> ]
12.3.2.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- MemberExpression の評価結果を baseReference とする
- ? GetValue(baseReference) を baseValue とする
- MemberExpression に一致するコードが strictモードコードであるなら、 true を、異なるなら false を strict とする
- ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression , strict)を返す
- MemberExpression の評価結果を baseReference とする
- ? GetValue(baseReference) を baseValue とする
- MemberExpression に一致するコードが strictモードコードであるなら、true を、異なるなら false を strict とする
- ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName , strict)を返す
- CallExpression の評価結果を baseReference とする
- ? GetValue(baseReference) を baseValue とする
- CallExpression に一致するコードが strictモードコードであるなら、 true を、異なるなら false を strict とする
- ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression , strict)を返す
- CallExpression の評価結果を baseReference とする
- ? GetValue(baseReference) を baseValue とする
- CallExpression に一致するコードが strictモードコードであるなら、 true を、異なるなら false を strict とする
- ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName , strict)を返す
12.3.3 ランタイムセマンティクス(Runtime Semantics): EvaluatePropertyAccessWithExpressionKey ( baseValue, expression, strict )
抽象操作EvaluatePropertyAccessWithExpressionKeyは、引数として値baseValue、パースノードexpression、およびブール引数strictを取ります。 次の手順を実行します。
- expression の評価結果を propertyNameReference とする
- ? GetValue(propertyNameReference) を propertyNameValue とする
- ? RequireObjectCoercible(baseValue) を bv とする
- ? ToPropertyKey(propertyNameValue) を propertyKey とする
- 基本値コンポーネントbv、参照名コンポーネントpropertyKey、strict参照フラグstrictのReference型の値を返す
12.3.4 ランタイムセマンティクス(Runtime Semantics): EvaluatePropertyAccessWithIdentifierKey ( baseValue, identifierName, strict )
抽象操作EvaluatePropertyAccessWithIdentifierKeyは、引数として値baseValue、解析ノードidentifierName、およびブール引数strictを取ります。 次の手順を実行します。
- Assert: identifierName は IdentifierName
- ? RequireObjectCoercible(baseValue) を bv とする
- identifierName のStringValueを propertyNameString とする
- 基本値コンポーネントbv、参照名コンポーネントpropertyNameString、strict参照フラグstrictのReference型の値を返す
12.3.5 new オペレーター(The new Operator)
12.3.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ? EvaluateNew(NewExpression , empty)を返す
- ? EvaluateNew(MemberExpression , Arguments )を返す
12.3.5.1.1 ランタイムセマンティクス(Runtime Semantics): EvaluateNew ( constructExpr, arguments )
抽象操作EvaluateNewは引数constructExprとargumentsを使用して、次の手順を実行します。
- Assert: constructExpr は NewExpression か MemberExpression
- Assert: arguments は empty か Arguments
- constructExpr の評価結果を ref とする
- ? GetValue(ref) を constructor とする
- arguments が empty なら、 空の新規List を argList とする
- 5.でないなら
- ? arguments の ArgumentListEvaluation を argList とする
- IsConstructor(constructor) が false なら、TypeError例外をスローする
- ? Construct(constructor, argList)を返す
12.3.6 関数呼び出し(Function Calls)
12.3.6.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- CoverCallExpressionAndAsyncArrowHead の CoveredCallExpression を expr とする
- expr の MemberExpression を memberExpr とする
- expr の Arguments を arguments とする
- memberExpr の評価結果を ref とする
- ? GetValue(ref) を func とする
- Type(ref) が Reference型 で、 IsPropertyReference(ref) が false で、 GetReferencedName(ref) が "eval" なら、
- SameValue(func, %eval%) が true なら、
- ? arguments の ArgumentListEvaluation を argList とする
- argList が要素を持っていないなら、 undefined を返す
- argList の最初の要素を evalArg とする
- CallExpression に一致するソースコードが、 strictモードコード なら、 true を strictCaller とする
Otherwise false を strictCaller とする - 現在のレルムレコード を evalRealm とする
- ? ["18","h-performeval"](evalArg, evalRealm, strictCaller, true)を返す
- SameValue(func, %eval%) が true なら、
- CallExpression を thisCall とする
- IsInTailPosition(thisCall) を tailCall とする
- ? EvaluateCall(func, ref, arguments, tailCall)を返す
ダイレクトeval
ステップ6.a.viを実行するCallExpression評価は、ダイレクトevalです。
- CallExpression の評価結果を ref とする
- ? GetValue(ref) を func とする
- CallExpression を thisCall とする
- IsInTailPosition(thisCall) を tailCall とする
- ? EvaluateCall(func, ref, Arguments , tailCall)を返す
12.3.6.2 ランタイムセマンティクス(Runtime Semantics): EvaluateCall ( func, ref, arguments, tailPosition )
抽象操作EvaluateCallは、引数として値func、値ref、パースノードarguments、およびブール値tailPositionを取ります。 次の手順を実行します。
- Type(ref) が Reference型なら、
- IsPropertyReference(ref) が true なら、
- GetThisValue(ref) を thisValue とする
- a. でないなら、
- Assert: ref の ベースは 環境レコード
- GetBase(ref) を refEnv とする
- refEnv.WithBaseObject() を thisValue とする
.
- IsPropertyReference(ref) が true なら、
- 1.でないなら、
- undefined を thisValue とする
- ? arguments の ArgumentListEvaluation を argList とする
- Type(func) が Object型でないなら、TypeError例外をスローする
- IsCallable(func) が false なら、TypeError例外をスローする
- tailPosition が true なら、PrepareForTailCallCall() を実行する
- Call(func, thisValue, argList) を result とする
- Assert: tailPosition が true なら、上記の呼び出しはここに戻らない。代わりに、次の戻りがすでに発生したかのように評価が続行される。
- Assert: result が 突然の完了 ではないなら、 Type(result) は ECMAScript言語値
- resultを返す
12.3.7 superキーワード(The super Keyword)
12.3.7.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- GetThisEnvironment() を env とする
- ? env.GetThisBinding() を actualThis とする
- Expression の評価結果を propertyNameReference とする
- ? GetValue(propertyNameReference) を propertyNameValue とする
- ? ToPropertyKey(propertyNameValue) を propertyKey とする
- SuperProperty に一致するコードが strictモードコード なら true、異なるなら false を strict とする
- ? MakeSuperPropertyReference(actualThis, propertyKey, strict)を返す
- GetThisEnvironment() を env とする
- ? env.GetThisBinding() を actualThis とする
- IdentifierName の StringValue を propertyKey とする
- SuperProperty に一致するコードが、 strictモードコード なら true、異なるなら false を strict とする
- ? MakeSuperPropertyReference(actualThis, propertyKey, strict)を返す
- GetNewTarget() を newTarget とする
- Assert: Type(newTarget) は Object型
- ! GetSuperConstructor() を func とする
- ? Arguments の ArgumentListEvaluation を argList とする
- IsConstructor(func) が false なら、TypeError例外をスローする.
- ? Construct(func, argList, newTarget) を result とする
- GetThisEnvironment() を thisER とする
- ? thisER.BindThisValue(result)を返す
12.3.7.2 ランタイムセマンティクス(Runtime Semantics): GetSuperConstructor ( )
抽象操作GetSuperConstructorは、次の手順を実行します。
- GetThisEnvironment() を envRec とする
- Assert: envRec は 関数環境レコード
- envRec.[[FunctionObject]] を activeFunction とする
- Assert: activeFunction is an ECMAScript関数オブジェクト.
- ! activeFunction.[[GetPrototypeOf]]() を superConstructor とする
- superConstructorを返す
12.3.7.3 ランタイムセマンティクス(Runtime Semantics): MakeSuperPropertyReference ( actualThis, propertyKey, strict )
抽象操作MakeSuperPropertyReferenceは引数actualThis、propertyKey、およびstrictを指定し、次の手順を実行します。
- GetThisEnvironment() を env とする
- Assert: env.HasSuperBinding() は true
- ? env.GetSuperBase() を baseValue とする
- ? RequireObjectCoercible(baseValue) を bv とする
- 基本値コンポーネントbv、参照名コンポーネントpropertyKey、thisValueコンポーネントactualThis、strict参照フラグstrict のスーパーリファレンスであるReference型の値を返す
12.3.8 引数リスト(Argument Lists)
12.3.8.1 ランタイムセマンティクス(Runtime Semantics): ArgumentListEvaluation
- 空の新規Listを返す
- AssignmentExpression の評価結果を ref とする
- ? GetValue(ref) を arg とする
- argが単一要素のListを返す
- 空の新規List を list とする
- AssignmentExpression を spreadRef とする
- ? GetValue(spreadRef) の評価結果を spreadObj とする
- ? GetIterator(spreadObj) を iteratorRecord とする
- 繰り返す
- ? IteratorStep(iteratorRecord) を next とする
- next が false なら、list を返す
- ? IteratorValue(next) を nextArg とする
- list の最後に nextArg を追加する
- ? of ArgumentList の ArgumentListEvaluation を precedingArgs とする
- AssignmentExpression の評価結果を ref とする
- ? GetValue(ref) を arg とする
- precedingArgs の最後に arg を追加する
- precedingArgs を返す
- ? ArgumentList の ArgumentListEvaluation を precedingArgs とする
- AssignmentExpression の評価結果を spreadRefとする
- ? GetIterator(? GetValue(spreadRef)) を iteratorRecord とする
- 繰り返す
- ? IteratorStep(iteratorRecord) を next とする
- next が false なら、 precedingArgs を返す
- ? IteratorValue(next) を nextArg とする
- precedingArgs の最後に nextArg を追加する
12.3.9 オプションチェーン(Optional Chains)
12.3.9.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- MemberExpression の評価結果を baseReference とする
- ? GetValue(baseReference) を baseValue とする
- baseValue が undefined か null なら、
- undefined を返す
- 引数 baseValue と baseReference を使用して OptionalChain の ChainEvaluation の結果を返す
- CallExpression の評価結果を baseReference とする
- ? GetValue(baseReference) を baseValue とする
- If baseValue が undefined か null なら、
- undefined を返す
- 引数 baseValue と baseReference を使用して OptionalChain の ChainEvaluation の結果を返す
- OptionalExpression の評価結果を baseReference とする
- ? GetValue(baseReference) を baseValue とする
- baseValue が undefined か null なら、
- undefined を返す
- 引数 baseValue と baseReference を使用して OptionalChain の ChainEvaluation の結果を返す
12.3.9.2 ランタイムセマンティクス(Runtime Semantics): ChainEvaluation
引数 baseValue と baseReference を使用。
- OptionalChain を thisChain とする
- IsInTailPosition(thisChain) を tailCall とする
- ? EvaluateCall(baseValue, baseReference, Arguments , tailCall)を返す
- OptionalChain に一致するコードが strictモードコード なら true 、異なるなら false を strict とする
- ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression , strict)を返す
- OptionalChain に一致するコードが strictモードコード なら true、 異なるなら false を strict とする
- ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName , strict)を返す
- OptionalChain を optionalChain とする
- 引数 baseValue と baseReference を使用して ? optionalChain の ChainEvaluation を newReference とする
- ? GetValue(newReference) を newValue とする
- OptionalChain を thisChain とする
- IsInTailPosition(thisChain) を tailCall とする
- ? EvaluateCall(newValue, newReference, Arguments , tailCall) を返す
- OptionalChain を optionalChain とする
- 引数 baseValue と baseReference を使用して ? optionalChain の ChainEvaluation を newReference とする
- ? GetValue(newReference) を newValue とする
- OptionalChain に一致するコードが strictモードコード なら true、 異なるなら false を strict とする
- ? EvaluatePropertyAccessWithExpressionKey(newValue, Expression , strict) を返す
- OptionalChain を optionalChain とする
- 引数 baseValue と baseReference を使用して ? optionalChain の ChainEvaluationを newReference とする
- ? GetValue(newReference) を newValue とする
- OptionalChain に一致するコードが strictモードコード なら true、異なるなら false を strict とする
- ? EvaluatePropertyAccessWithIdentifierKey(newValue, IdentifierName , strict)を返す
12.3.10 インポート呼び出し(Import Calls)
12.3.10.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ! GetActiveScriptOrModule() を referencingScriptOrModule とする
- AssignmentExpression の評価結果を argRef とする
- ? GetValue(argRef) を specifier とする
- ! NewPromiseCapability(%Promise%) を promiseCapability とする
- ToString(specifier) を specifierString とする
- IfAbruptRejectPromise(specifierString, promiseCapability).
- ! HostImportModuleDynamically(referencingScriptOrModule, specifierString, promiseCapability)を実行
- promiseCapability.[[Promise]] を返す
12.3.11 タグ付きテンプレート(Tagged Templates)
12.3.11.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- MemberExpression の評価結果を tagRef とする
- ? GetValue(tagRef) を tagFunc とする
- MemberExpression を thisCall とする
- IsInTailPosition(thisCall) を tailCall とする
- ? EvaluateCall(tagFunc, tagRef, TemplateLiteral , tailCall)を返す
- 評価結果 CallExpression を tagRef とする
- ?GetValue(tagRef) を tagFunc とする
- this CallExpression を thisCall とする
- IsInTailPosition(thisCall) を tailCall とする
- を返す?EvaluateCall(tagFunc, tagRef, TemplateLiteral , tailCall).
12.3.12 メタプロパティ(Meta Properties)
12.3.12.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- GetNewTarget()を返す
- !GetActiveScriptOrModule() を module とする
- Assert: module は ソーステキストモジュールレコード
- module.[[ImportMeta]] を importMeta とする
- importMeta が empty なら、
- ! OrdinaryObjectCreate(null) を importMeta にセットする
- ! HostGetImportMetaProperties(module) を importMetaValues とする
- mportMetaValues の各Record型{[[Key]],[[Value]]}要素を p とし、各 p ごとに、
- !CreateDataPropertyOrThrow(importMeta, p.[[Key]], p.[[Value]])を実行
- ! HostFinalizeImportMeta(importMeta, module)を実行
- importMeta を module.[[ImportMeta]] にセットする
- importMetaを返す
- 4. でなければ
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)
構文:
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)
- LeftHandSideExpressionのAssignmentTargetTypeがsimpleでないなら、早期構文エラーです
- UnaryExpressionのAssignmentTargetTypeがsimpleでないなら、早期構文エラーです
12.4.2 静的セマンティクス(Static Semantics): IsFunctionDefinition
LeftHandSideExpression ++
LeftHandSideExpression --
++UnaryExpression
--UnaryExpression
- false を返す
12.4.3 静的セマンティクス(Static Semantics): AssignmentTargetType
LeftHandSideExpression ++
LeftHandSideExpression --
++UnaryExpression
--UnaryExpression
- invalidを返す
12.4.4 後置インクリメント演算子(Postfix Increment Operator)
12.4.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
12.4.5 後置デクリメント演算子(Postfix Decrement Operator)
12.4.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
12.4.6 前置インクリメント演算子(Prefix Increment Operator)
12.4.6.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
12.4.7 前置デクリメント演算子(Prefix Decrement Operator)
12.4.7.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
12.5 単項演算子(Unary Operators)
構文:
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
deleteUnaryExpression
voidUnaryExpression
typeofUnaryExpression
+UnaryExpression
-UnaryExpression
~UnaryExpression
!UnaryExpression
AwaitExpression
- false を返す
12.5.2 静的セマンティクス(Static Semantics): AssignmentTargetType
deleteUnaryExpression
voidUnaryExpression
typeofUnaryExpression
+UnaryExpression
-UnaryExpression
~UnaryExpression
!UnaryExpression
AwaitExpression
- invalidを返す
12.5.3 delete演算子(The delete Operator)
12.5.3.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- UnaryExpression が strictモードコード に含まれていて、派生したUnaryExpressionが、PrimaryExpression : IdentifierReference のとき、構文エラーです
- 派生した UnaryExpression が PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList のとき、構文エラーです。また、最終的にCoverParenthesizedExpressionAndArrowParameterList は、 UnaryExpressionの代わりに使用されると、これらの規則に従って構文エラーを生成するフレーズを導き出します。
12.5.3.2 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- UnaryExpression の評価結果を ref とする
- ReturnIfAbrupt(ref)
- Type(ref) が Reference でないなら、 true を返す
- IsUnresolvableReference(ref) が true なら、
- Assert: IsStrictReference(ref) は false
- true を返す
- IsPropertyReference(ref) が true なら、
- IsSuperReference(ref) が true なら、ReferenceError例外をスローする
- ! ToObject(GetBase(ref)) を baseObj とする
- ? baseObj.[[Delete]](GetReferencedName(ref)) を deleteStatus とする
. - deleteStatus が false で、 IsStrictReference(ref) が true なら、TypeError例外をスローする
- deleteStatusを返す
- 5.でないなら、
12.5.4 void演算子(The void Operator)
12.5.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- UnaryExpression の評価結果を expr とする
- ? GetValue(expr)を実行
- undefined を返す
12.5.5 typeof演算子(The typeof Operator)
12.5.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- UnaryExpression の評価結果を val とする
- Type(val) が Reference なら、
- IsUnresolvableReference(val) が true なら、"undefined" を返す
- ? GetValue(val) を val にセットする
- 表35を参照して、対応する文字列を返す
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)
- UnaryExpression の評価結果を expr とする
- ? ToNumber(? GetValue(expr))を返す
12.5.7 単項-演算子(Unary - Operator)
12.5.7.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- UnaryExpression の評価結果を expr とする
- ? ToNumeric(? GetValue(expr)) を oldValue とする
- Type(oldValue) を T とする
- ! T::unaryMinus(oldValue)を返す
12.5.8 ビット否定演算子(Bitwise NOT Operator) ( ~ )
12.5.8.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- UnaryExpression の評価結果を expr とする
- ? ToNumeric(? GetValue(expr)) を oldValue とする
- Type(oldValue) を T とする
- ! T::bitwiseNOT(oldValue)を返す
12.5.9 論理否定演算子(Logical NOT Operator) ( ! )
12.5.9.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- UnaryExpression の評価結果を expr とする
- ! ToBoolean(? GetValue(expr)) を oldValue とする
- oldValue が true なら、 false を返す
- true を返す
12.6 べき乗演算子(Exponentiation Operator)
構文:
UnaryExpression[?Yield, ?Await]
UpdateExpression[?Yield, ?Await] **ExponentiationExpression[?Yield, ?Await]
12.6.1 静的セマンティクス(Static Semantics): IsFunctionDefinition
- false を返す
12.6.2 静的セマンティクス(Static Semantics): AssignmentTargetType
- invalidを返す
12.6.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- UpdateExpression の評価結果を left とする
- ? GetValue(left) を leftValue とする
- ExponentiationExpression の評価結果を right とする
- ? GetValue(right) を rightValue とする
- ? ToNumeric(leftValue) を base とする
- ? ToNumeric(rightValue) を exponent とする
- Type(base) が Type(exponent) と異なるなら、 TypeError例外をスローする
- ? Type(base)::exponentiate(base, exponent)を返す
12.7 乗算演算子(Multiplicative Operators)
構文:
ExponentiationExpression[?Yield, ?Await]
MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await]
12.7.1 静的セマンティクス(Static Semantics): IsFunctionDefinition
- false を返す
12.7.2 静的セマンティクス(Static Semantics): AssignmentTargetType
- invalid を返す
12.7.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- MultiplicativeExpression の評価結果を left とする
- ? GetValue(left) を leftValue とする
- ExponentiationExpression の評価結果を right とする
- ? GetValue(right) を rightValue とする
- ? ToNumeric(leftValue) を lnum とする
- ? ToNumeric(rightValue) を rnum とする
- Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする
- Type(lnum) を T とする
- MultiplicativeOperator が * なら、 T::multiply(lnum, rnum) を返す
- MultiplicativeOperator が / なら、T::divide(lnum, rnum) を返す
- 10. でないなら、
- Assert: MultiplicativeOperator は %
- T::remainder(lnum, rnum)を返す
12.8 加算演算子(Additive Operators)
構文:
MultiplicativeExpression[?Yield, ?Await]
AdditiveExpression[?Yield, ?Await] +MultiplicativeExpression[?Yield, ?Await]
AdditiveExpression[?Yield, ?Await] -MultiplicativeExpression[?Yield, ?Await]
12.8.1 静的セマンティクス(Static Semantics): IsFunctionDefinition
AdditiveExpression +MultiplicativeExpression
AdditiveExpression -MultiplicativeExpression
- false を返す
12.8.2 静的セマンティクス(Static Semantics): AssignmentTargetType
AdditiveExpression +MultiplicativeExpression
AdditiveExpression -MultiplicativeExpression
- invalid を返す
12.8.3 The Addition Operator ( + )
12.8.3.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- AdditiveExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- MultiplicativeExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- ? ToPrimitive(lval) を lprim とする
- ? ToPrimitive(rval) を rprim とする
- Type(lprim) か Type(rprim) が String型なら、
- ? ToNumeric(lprim) を lnum とする
- ? ToNumeric(rprim) を rnum とする
- Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする.
- Type(lnum) を T とする
- T::add(lnum, rnum)を返す
12.8.4 減算演算子(The Subtraction Operator) ( - )
12.8.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
12.9 ビットシフト演算子(Bitwise Shift Operators)
構文:
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
ShiftExpression <<AdditiveExpression
ShiftExpression >>AdditiveExpression
ShiftExpression >>>AdditiveExpression
- false を返す
12.9.2 静的セマンティクス(Static Semantics): AssignmentTargetType
ShiftExpression <<AdditiveExpression
ShiftExpression >>AdditiveExpression
ShiftExpression >>>AdditiveExpression
- invalid を返す
12.9.3 左シフト演算子(The Left Shift Operator) ( << )
12.9.3.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
12.9.4 The Signed Right Shift Operator ( >> )
12.9.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ShiftExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- AdditiveExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- ? ToNumeric(lval) を lnum とする
- ? ToNumeric(rval) を rnum とする
- Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする
- Type(lnum) を T とする
- T::signedRightShift(lnum, rnum)を返す
12.9.5 T符号なし右シフト演算子(he Unsigned Right Shift Operator) ( >>> )
12.9.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ShiftExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- AdditiveExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- ? ToNumeric(lval) を lnum とする
- ? ToNumeric(rval) を rnum とする
- Type(lnum) と Type(rnum) が異なるなら、 TypeError例外をスローする
- Type(lnum) を T とする
- T::unsignedRightShift(lnum, rnum) を返す
12.10 関係演算子(Relational Operators)
構文:
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]
12.10.1 静的セマンティクス(Static Semantics): IsFunctionDefinition
RelationalExpression <ShiftExpression
RelationalExpression >ShiftExpression
RelationalExpression <=ShiftExpression
RelationalExpression >=ShiftExpression
RelationalExpression instanceofShiftExpression
RelationalExpression inShiftExpression
- false を返す
12.10.2 静的セマンティクス(Static Semantics): AssignmentTargetType
RelationalExpression <ShiftExpression
RelationalExpression >ShiftExpression
RelationalExpression <=ShiftExpression
RelationalExpression >=ShiftExpression
RelationalExpression instanceofShiftExpression
RelationalExpression inShiftExpression
- invalid を返す
12.10.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- RelationalExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- ShiftExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- 抽象関係比較 lval < rval の実行結果を r とする
- ReturnIfAbrupt(r)
- r が undefined なら false を、 異なるなら r を返す
- RelationalExpression 評価結果を lref とする
- ? GetValue(lref) を lval とする
- ShiftExpression 評価結果を rref とする
- ? GetValue(rref) を rval とする
- LeftFirstをfalseとし、抽象関係比較 rval < lval の実行結果を r とする
- ReturnIfAbrupt(r)
- r が undefined なら false を、 異なるなら r を返す
- RelationalExpression 評価結果を lref とする
- ? GetValue(lref) を lval とする
- ShiftExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- LeftFirstをfalseとし、抽象関係比較 rval < lval の実行結果を r とする
- ReturnIfAbrupt(r)
- r が true または undefined なら、 false を、異なるなら true を返す
- RelationalExpression 評価結果を lref とする
- ? GetValue(lref) を lval とする
- ShiftExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- 抽象関係比較 lval < rval の実行結果 を r とする
- ReturnIfAbrupt(r)
- r が true または undefined なら、 false を、異なるなら true を返す
- RelationalExpression 評価結果を lref とする
- ? GetValue(lref) を lval とする
- ShiftExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- ? InstanceofOperator(lval, rval)を返す
- RelationalExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- ShiftExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- Type(rval) が Object型でないなら、TypeError例外をスローする
- ? HasProperty(rval, ? ToPropertyKey(lval))を返す
12.10.4 ランタイムセマンティクス(Runtime Semantics): InstanceofOperator ( V, target )
抽象操作InstanceofOperatorは、ECMAScript値Vがオブジェクトtargetのインスタンスかどうかを判断する汎用アルゴリズムです。targetの@@hasinstanceメソッドを参照、または、@@hasinstanceメソッドが存在しない場合はVのプロトタイプチェーンにtargetの"prototype"プロパティの値が存在するかどうかで判断します。 この抽象操作は、次の手順を実行します。
12.11 等値演算子(Equality Operators)
構文:
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
EqualityExpression ==RelationalExpression
EqualityExpression !=RelationalExpression
EqualityExpression ===RelationalExpression
EqualityExpression !==RelationalExpression
- false を返す
12.11.2 静的セマンティクス(Static Semantics): AssignmentTargetType
EqualityExpression ==RelationalExpression
EqualityExpression !=RelationalExpression
EqualityExpression ===RelationalExpression
EqualityExpression !==RelationalExpression
- invalid を返す
12.11.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- EqualityExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- RelationalExpression を rref とする
- ? GetValue(rref) の評価結果を rval とする
- 抽象等値比較 rval == lval の実行結果を返す
- EqualityExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- RelationalExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- 抽象等値比較 rval == lval の実行結果を r とする
- ReturnIfAbrupt(r)
- r が true なら、 false を、true を返す
- EqualityExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- RelationalExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- 厳密等値比較 rval === lval の実行結果を返す
- EqualityExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- RelationalExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- 厳密等値比較 rval === lval の実行結果を r とする
- Assert: r は通常の完了
- r.[[Value]] が true なら、 false を、 true を返す
- 文字列の比較は`${a}` == `${b}`によって強制できます
- 数値比較は +a == +b によって強制できます
- ブール比較は !a == !b によって強制できます
- A != B と !(A == B) は同等です。
- A == B は、AとBの評価の順序を除いて、B == A と同等です。
例:
- new String("a") == "a" と "a" == new String("a") は共に true
- new String("a") == new String("a") は false
12.12 バイナリビット演算子(Binary Bitwise Operators)
構文:
EqualityExpression[?In, ?Yield, ?Await]
BitwiseANDExpression[?In, ?Yield, ?Await] &EqualityExpression[?In, ?Yield, ?Await]
BitwiseANDExpression[?In, ?Yield, ?Await]
BitwiseXORExpression[?In, ?Yield, ?Await] ^BitwiseANDExpression[?In, ?Yield, ?Await]
BitwiseXORExpression[?In, ?Yield, ?Await]
BitwiseORExpression[?In, ?Yield, ?Await] |BitwiseXORExpression[?In, ?Yield, ?Await]
12.12.1 静的セマンティクス(Static Semantics): IsFunctionDefinition
- false を返す
12.12.2 静的セマンティクス(Static Semantics): AssignmentTargetType
- invalid を返す
12.12.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
プロダクション A :A @ B(@はビット演算子の1つ)は、次のように評価されます。
- A の評価結果を lref とする
- ? GetValue(lref) を lval とする
- B の評価結果を rref とする
- ? GetValue(rref) を rval とする
- ? ToNumeric(lval) を lnum とする
- ? ToNumeric(rval) を rnum とする
- Type(lnum) と Type(rnum) が異なるなら TypeError例外をスローする
- Type(lnum) を T とする
- @ が & なら T::bitwiseAND(lnum, rnum) を返す
- @ が | なら、 T::bitwiseOR(lnum, rnum) を返す
- 9. 10. と異なるなら、
- Assert: @ は ^
- T::bitwiseXOR(lnum, rnum) を返す
12.13 バイナリ論理演算子(Binary Logical Operators)
構文:
BitwiseORExpression[?In, ?Yield, ?Await]
LogicalANDExpression[?In, ?Yield, ?Await] &&BitwiseORExpression[?In, ?Yield, ?Await]
LogicalANDExpression[?In, ?Yield, ?Await]
LogicalORExpression[?In, ?Yield, ?Await] ||LogicalANDExpression[?In, ?Yield, ?Await]
CoalesceExpressionHead[?In, ?Yield, ?Await] ??BitwiseORExpression[?In, ?Yield, ?Await]
CoalesceExpression[?In, ?Yield, ?Await]
BitwiseORExpression[?In, ?Yield, ?Await]
LogicalORExpression[?In, ?Yield, ?Await]
CoalesceExpression[?In, ?Yield, ?Await]
12.13.1 静的セマンティクス(Static Semantics): IsFunctionDefinition
- false を返す
12.13.2 静的セマンティクス(Static Semantics): AssignmentTargetType
- invalid を返す
12.13.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- LogicalANDExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- ! ToBoolean(lval) を lbool とする
- lbool が false なら、lval を返す
- BitwiseORExpression の評価結果を rref とする
- ? GetValue(rref) を返す
- LogicalORExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- ! ToBoolean(lval) を lbool とする
- lbool が true なら、lval を返す
- LogicalANDExpression の評価結果を rref とする
- ? GetValue(rref) を返す
- CoalesceExpressionHead の評価結果を lref とする
- ? GetValue(lref) を lval とする
- lval が undefined か null なら、
- BitwiseORExpression の評価結果を rref とする
- ? GetValue(rref) を返す
- lvalを返す
12.14 三項(条件)演算子(Conditional Operator) ( ? : )
構文:
ShortCircuitExpression[?In, ?Yield, ?Await]
ShortCircuitExpression[?In, ?Yield, ?Await] ?AssignmentExpression[+In, ?Yield, ?Await] :AssignmentExpression[?In, ?Yield, ?Await]
12.14.1 静的セマンティクス(Static Semantics): IsFunctionDefinition
- false を返す
12.14.2 静的セマンティクス(Static Semantics): AssignmentTargetType
- invalid を返す
12.14.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- ShortCircuitExpression の評価結果を lref とする
- ! ToBoolean(? GetValue(lref)) を lval とする
- lval が true なら、
- 最初の AssignmentExpression の評価結果を trueRef とする
- ? GetValue(trueRef) を返す
- 3. でないなら
- 2番目の AssignmentExpression の評価結を falseRef とする
- ? GetValue(falseRef) を返す/li>
12.15 割り当て演算子(Assignment Operators)
構文:
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]
12.15.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
LeftHandSideExpression が ObjectLiteral またはArrayLiteral の場合、次の早期エラールールが適用されます。
- LeftHandSideExpression が AssignmentPattern をカバーしていない場合は、構文エラーです。
- AssignmentPatternとその派生プロダクションの早期エラールールは、LeftHandSideExpressionでカバーされるAssignmentPatternにも適用されます。
LeftHandSideExpression が ObjectLiteral でも ArrayLiteral でもない場合、次の早期エラールールが適用されます。
- LeftHandSideExpression の AssignmentTargetType が simple でない場合、構文エラーになります。
- LeftHandSideExpression の AssignmentTargetType が simple でない場合、構文エラーになります。
12.15.2 静的セマンティクス(Static Semantics): IsFunctionDefinition
- true を返す
YieldExpression
LeftHandSideExpression =AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
- false を返す
12.15.3 静的セマンティクス(Static Semantics): AssignmentTargetType
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression =AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
- invalid を返す
12.15.4 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- LeftHandSideExpression が ObjectLiteral と ArrayLiteral でないなら、
- LeftHandSideExpression の評価結果を lref とする
- ReturnIfAbrupt(lref)
- IsAnonymousFunctionDefinition(AssignmentExpression ) と LeftHandSideExpression の IsIdentifierRef の両方が true なら、
- 引数 GetReferencedName(lref) を使用して AssignmentExpression の NamedEvaluation を rval とする
- c. でないなら
- AssignmentExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- ? PutValue(lref, rval)を実行
- rval を返す
- LeftHandSideExpression によってカバーされている AssignmentPattern を assignmentPattern とする
- AssignmentExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- 引数として rval を使用して ? assignmentPattern の DestructuringAssignmentEvaluation を実行
- rval を返す
- LeftHandSideExpression の評価結果を lref とする
- ? GetValue(lref) を lval とする
- AssignmentExpression の評価結果を rref とする
- ? GetValue(rref) を rval とする
- AssignmentOperator を @= としたときの @ にあたる文字を op とする。
- 式 lval op rval の適用結果を r とする
- ? PutValue(lref, r) を実行
- rを返す
12.15.5 分割代入(Destructuring Assignment)
補足構文:
プロダクション AssignmentExpression:LeftHandSideExpression =AssignmentExpression の特定の状況におけるインスタンス処理では、次の文法を使用して、LeftHandSideExpressionの解釈を変更します。
ObjectAssignmentPattern[?Yield, ?Await]
ArrayAssignmentPattern[?Yield, ?Await]
{}
{AssignmentRestProperty[?Yield, ?Await] }
{AssignmentPropertyList[?Yield, ?Await] }
{AssignmentPropertyList[?Yield, ?Await] ,AssignmentRestProperty[?Yield, ?Await]opt }
[Elisionopt AssignmentRestElement[?Yield, ?Await]opt ]
[AssignmentElementList[?Yield, ?Await] ]
[AssignmentElementList[?Yield, ?Await] ,Elisionopt AssignmentRestElement[?Yield, ?Await]opt ]
AssignmentProperty[?Yield, ?Await]
AssignmentPropertyList[?Yield, ?Await] ,AssignmentProperty[?Yield, ?Await]
AssignmentElisionElement[?Yield, ?Await]
AssignmentElementList[?Yield, ?Await] ,AssignmentElisionElement[?Yield, ?Await]
IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
PropertyName[?Yield, ?Await] :AssignmentElement[?Yield, ?Await]
DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
12.15.5.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- IdentifierReference の AssignmentTargetType が simple でないなら、構文エラーです。
- DestructuringAssignmentTarget が ArrayLiteral か ObjectLiteral なら、構文エラーです。
LeftHandSideExpression が ObjectLiteral か ArrayLiteral なら、 次の早期エラールールが適用されます。
- LeftHandSideExpression が、AssignmentPattern をカバーされていないなら、構文エラーです。
- AssignmentPattern と、その派生プロダクションの早期エラールールは、LeftHandSideExpression でカバーされる AssignmentPattern にも適用されます。
LeftHandSideExpression が ObjectLiteral でも ArrayLiteral でもない場合、次の早期エラールールが適用されます。
- LeftHandSideExpression の AssignmentTargetType が simple でないなら、構文エラーです。
12.15.5.2 ランタイムセマンティクス(Runtime Semantics): DestructuringAssignmentEvaluation
引数 value を使用。
- ? RequireObjectCoercible(value) を実行する
- NormalCompletion(empty) を返す
- ? RequireObjectCoercible(value) を実行する
- 引数 value を使用して ? AssignmentPropertyList の PropertyDestructuringAssignmentEvaluation を実行する
- NormalCompletion(empty) を返す
- ? GetIterator(value) を iteratorRecord とする
- ? IteratorClose(iteratorRecord, NormalCompletion(empty)) を返す
- ? GetIterator(value) を iteratorRecord とする
- 引数 iteratorRecord を使用して Elision の IteratorDestructuringAssignmentEvaluation を result とする
- iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, result) を返す
- result を返す
- ? GetIterator(value) を iteratorRecord とする
- Elision が存在するなら、
- 引数 iteratorRecord を使用して Elision の IteratorDestructuringAssignmentEvaluation を status とする
- status が 突然の完了 なら、
- Assert: iteratorRecord.[[Done]] は true
- Completion(status) を返す
- 引数 iteratorRecord を使用してof AssignmentRestElement の IteratorDestructuringAssignmentEvaluation を result とする
- iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, result)を返す
- result を返す
- ? GetIterator(value) を iteratorRecord とする
- 引数 iteratorRecord を使用して AssignmentElementList IteratorDestructuringAssignmentEvaluation を result とする
- iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, result) を返す
- result を返す
- ? GetIterator(value) を iteratorRecord とする
- 引数 iteratorRecord を使用して AssignmentElementList のIteratorDestructuringAssignmentEvaluation を status とする
- status が 突然の完了 なら、
- iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, status)を返す
- Completion(status) を返す
- Elision が存在するなら、
- 引数 iteratorRecord を使用して Elision のIteratorDestructuringAssignmentEvaluation の実行結果を status にセットする
- status が 突然の完了 なら、
- Assert: iteratorRecord.[[Done]] は true
- Completion(status) を返す
- AssignmentRestElement が存在なら、
- 引数 iteratorRecord を使用して AssignmentRestElement の IteratorDestructuringAssignmentEvaluation の実行結果を status にセットする
- iteratorRecord.[[Done]] が false なら、? IteratorClose(iteratorRecord, status)を返す
- Completion(status) を返す
- ? RequireObjectCoercible(value) を実行する
- 空の新規List を excludedNames とする
- 引数 value と excludedNames を使用して AssignmentRestProperty RestDestructuringAssignmentEvaluation の実行結果を返す
- ? RequireObjectCoercible(value) を実行する
- 引数 value を使用して ? AssignmentPropertyList PropertyDestructuringAssignmentEvaluation を excludedNames とする
- 引数 value と excludedNames を使用して AssignmentRestProperty の RestDestructuringAssignmentEvaluation の実行結果を返す
12.15.5.3 ランタイムセマンティクス(Runtime Semantics): PropertyDestructuringAssignmentEvaluation
引数 value を使用。
- 引数 value を使用して AssignmentPropertyList の ? PropertyDestructuringAssignmentEvaluation を propertyNames とする
- 引数 value を使用して AssignmentProperty の ? PropertyDestructuringAssignmentEvaluation を nextNames とする
- propertyNames の最後に nextNames の各アイテムを追加する
- propertyNames を返す
- IdentifierReference の StringValue を P とする
- ? ResolveBinding(P) を lref とする
- ? GetV(value, P) を v とする
- Initializeropt が 存在し、 v が undefined なら、
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- 引数 P を使用して Initializer の NamedEvaluation の実行結果を v にセットする
- a. でないなら、
- Initializer の評価結果を defaultValue とする
- ? GetValue(defaultValue) を v にセットする
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- ? PutValue(lref, v) を実行する
- P を含む新しいリストを返す
- PropertyName の評価結果を name とする
- ReturnIfAbrupt(name)
- 引数 value と name を使用して ? AssignmentElement の KeyedDestructuringAssignmentEvaluation を実行する
- name を含む新しいリストを返す
12.15.5.4 ランタイムセマンティクス(Runtime Semantics): RestDestructuringAssignmentEvaluation
引数 value と excludedNames を使用。
- DestructuringAssignmentTarget の評価結果を lref とする
- ReturnIfAbrupt(lref)
- OrdinaryObjectCreate(%Object.prototype%) を restObj とする
- ? CopyDataProperties(restObj, value, excludedNames) を実行する
- PutValue(lref, restObj) を返す
12.15.5.5 ランタイムセマンティクス(Runtime Semantics): IteratorDestructuringAssignmentEvaluation
引数 iteratorRecord を使用。
- 引数 iteratorRecord を使用して AssignmentElisionElement の IteratorDestructuringAssignmentEvaluation の実行結果を返す
- 引数 iteratorRecord を使用して ? AssignmentElementList の IteratorDestructuringAssignmentEvaluation を実行する
- 引数 iteratorRecord を使用して AssignmentElisionElement の IteratorDestructuringAssignmentEvaluation の実行結果を返す
- 引数 iteratorRecord を使用して AssignmentElement の IteratorDestructuringAssignmentEvaluation の実行結果を返す
- 引数 iteratorRecord を使用して ? Elision の IteratorDestructuringAssignmentEvaluation を実行する
- 引数 iteratorRecord を使用して AssignmentElement の IteratorDestructuringAssignmentEvaluation の実行結果を返す
- iteratorRecord.[[Done]] が false なら、
- IteratorStep(iteratorRecord) を next とする
- next が an 突然の完了 なら、true を iteratorRecord.[[Done]] にセット
- ReturnIfAbrupt(next)
- next が false なら、true を iteratorRecord.[[Done]] にセット
- NormalCompletion(empty) を返す
- 引数 iteratorRecord を使用して ? Elision のIteratorDestructuringAssignmentEvaluation を実行する
- iteratorRecord.[[Done]] が false なら、
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了 なら、true を iteratorRecord.[[Done]] にセット
- ReturnIfAbrupt(next)
- next が false なら、true を iteratorRecord.[[Done]] にセット
- NormalCompletion(empty) を返す
- DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral でないなら、
- DestructuringAssignmentTarget の評価結果を lref とする
- ReturnIfAbrupt(lref)
- iteratorRecord.[[Done]] が false なら、
- IteratorStep(iteratorRecord) を next とする
- next が an 突然の完了 なら、true を iteratorRecord.[[Done]] にセット
- ReturnIfAbrupt(next)
- next が false なら、、true を iteratorRecord.[[Done]] にセット
- d. でないなら、
- IteratorValue(next) を value とする
- value が 突然の完了 なら、true を iteratorRecord.[[Done]] にセット
- ReturnIfAbrupt(value)
- iteratorRecord.[[Done]] が true なら、undefined を value とする
- Initializer が 存在し、 value が undefined なら、
- IsAnonymousFunctionDefinition(Initializer ) と DestructuringAssignmentTarget の IsIdentifierRef の両方が true なら、
- 引数 GetReferencedName(lref) を使用して Initializer の NamedEvaluation を v とする
- a. でないなら、
- Initializer の評価結果を defaultValue とする
- ? GetValue(defaultValue) を v とする
- IsAnonymousFunctionDefinition(Initializer ) と DestructuringAssignmentTarget の IsIdentifierRef の両方が true なら、
- 4. でないなら、value を v とする
- DestructuringAssignmentTarget が ObjectLiteral か ArrayLiteral なら、
- DestructuringAssignmentTarget によってカバーされている AssignmentPattern を nestedAssignmentPattern とする
- 引数 v を使用して nestedAssignmentPattern の DestructuringAssignmentEvaluation の実行結果を返す
- ? PutValue(lref, v) を返す
- DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral でないなら、
- DestructuringAssignmentTarget の評価結果を lref とする
- ReturnIfAbrupt(lref)
- ! ArrayCreate(0) を A とする
- 0 を n とする
- iteratorRecord.[[Done]] が false の間繰り返し
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了 なら、true を iteratorRecord.[[Done]] にセット
- ReturnIfAbrupt(next)
- next が false なら、true を iteratorRecord.[[Done]] にセット
- d. でないなら、
- IteratorValue(next) を nextValue とする
- nextValue が 突然の完了 なら、true を iteratorRecord.[[Done]] にセット
- ReturnIfAbrupt(nextValue)
- ! CreateDataPropertyOrThrow(A, ! ToString(n), nextValue) を実行する
- n + 1 を n にセットする
- DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral でないなら、
- DestructuringAssignmentTarget によってカバーされている AssignmentPattern を nestedAssignmentPattern とする
- 引数 A を使用して nestedAssignmentPattern の DestructuringAssignmentEvaluation の実行結果を返す
12.15.5.6 ランタイムセマンティクス(Runtime Semantics): KeyedDestructuringAssignmentEvaluation
引数 value と propertyName を使用。
- DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral でないなら、
- DestructuringAssignmentTarget の評価結果を lref とする
- ReturnIfAbrupt(lref)
- ? GetV(value, propertyName) を v とする
- Initializer が存在し、v が undefined なら、
- IsAnonymousFunctionDefinition(Initializer ) と DestructuringAssignmentTarget の IsIdentifierRef の両方が true なら、
- 引数 GetReferencedName(lref) を使用して Initializer の NamedEvaluation を rhsValue とする
- a. でないなら、
- Initializer の評価結果を defaultValue とする
- ? GetValue(defaultValue) を rhsValue とする
- IsAnonymousFunctionDefinition(Initializer ) と DestructuringAssignmentTarget の IsIdentifierRef の両方が true なら、
- 3. でないなら、 v を rhsValue とする
- DestructuringAssignmentTarget が ObjectLiteral か ArrayLiteral なら、
- DestructuringAssignmentTarget によってカバーされている AssignmentPattern を assignmentPattern とする
- 引数 rhsValue を使用して assignmentPattern の DestructuringAssignmentEvaluation の実行結果を返す
- ? PutValue(lref, rhsValue) を返す
12.16 カンマ演算子(Comma Operator) ( , )
構文:
AssignmentExpression[?In, ?Yield, ?Await]
Expression[?In, ?Yield, ?Await] ,AssignmentExpression[?In, ?Yield, ?Await]
12.16.1 静的セマンティクス(Static Semantics): IsFunctionDefinition
- false を返す
12.16.2 静的セマンティクス(Static Semantics): AssignmentTargetType
- invalid を返す
12.16.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Expression の評価結果を lref とする
- ? GetValue(lref) を実行する
- AssignmentExpression の評価結果を rref とする
- ? GetValue(rref) を返す
let
await 0;