メインコンテンツまでスキップ

ECMAScript仕様理解パート2の「追加内容」

· 約3分
[Marja Hölttä](https://twitter.com/marjakh), 推測的仕様の観察者

なぜo2.fooAssignmentExpressionなのか?

o2.fooAssignmentExpressionには見えません。なぜなら代入がないからです。なぜこれがAssignmentExpressionなのでしょうか?

仕様では、AssignmentExpressionを引数として使用したり代入の右辺に使用することが認められています。例を挙げると:

function simple(a) {
console.log('引数は ' + a);
}
simple(x = 1);
// → 「引数は 1」とログに記録される。
x;
// → 1

…および…

x = y = 5;
x; // 5
y; // 5

o2.fooは何も代入をしないAssignmentExpressionです。これには以下の文法生成規則が基づいています。それぞれ「最も簡単な」ケースをたどって最後に至ります:

AssignmentExpressionは代入を伴う必要はなく、ConditionalExpressionであることもできます:

AssignmentExpression : ConditionalExpression

(他にも生成規則がありますが、ここでは関連性のあるもののみを示しています。)

ConditionalExpressionは条件式(a == b ? c : d)を持たない必要はなく、ShortCircuitExpressionだけでも構いません:

ConditionalExpression : ShortCircuitExpression

さらに続けて:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

もう少しです…

ShiftExpression : AdditiveExpression

AdditiveExpression : MultiplicativeExpression

MultiplicativeExpression : ExponentialExpression

ExponentialExpression : UnaryExpression

絶望しないでください!もう少しです…

UnaryExpression : UpdateExpression

UpdateExpression : LeftHandSideExpression

LeftHandSideExpressionの生成規則にたどり着きます:

LeftHandSideExpression : NewExpression CallExpression OptionalExpression

o2.fooに適用される生成規則を特定することは明確ではありません。ただし、NewExpressionが実際にはnewキーワードを持つ必要がないことを知る必要があります(または確認する必要があります)。

NewExpression : MemberExpression

MemberExpressionは探していたもののようですので、次はこの生成規則を取得します:

MemberExpression : MemberExpression . IdentifierName

したがって、o2.fooo2が有効なMemberExpressionである場合、MemberExpressionです。幸運なことに、それははるかに簡単に見ることができます:

MemberExpression : PrimaryExpression

PrimaryExpression : IdentifierReference

IdentifierReference : Identifier

o2は確かにIdentifierであるため問題ありません。o2MemberExpressionであり、したがってo2.fooMemberExpressionです。MemberExpressionは有効なAssignmentExpressionなので、o2.fooAssignmentExpressionにもなります。