ECMAScript仕様理解パート2の「追加内容」
なぜo2.foo
はAssignmentExpression
なのか?
o2.foo
はAssignmentExpression
には見えません。なぜなら代入がないからです。なぜこれが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
であることもできます:
(他にも生成規則がありますが、ここでは関連性のあるもののみを示しています。)
ConditionalExpression
は条件式(a == b ? c : d
)を持たない必要はなく、ShortCircuitExpression
だけでも構いません:
さらに続けて:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
もう少しです…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
絶望しないでください!もう少しです…
LeftHandSideExpression
の生成規則にたどり着きます:
LeftHandSideExpression :
NewExpression
CallExpression
OptionalExpression
o2.foo
に適用される生成規則を特定することは明確ではありません。ただし、NewExpression
が実際にはnew
キーワードを持つ必要がないことを知る必要があります(または確認する必要があります)。
MemberExpression
は探していたもののようですので、次はこの生成規則を取得します:
したがって、o2.foo
はo2
が有効なMemberExpression
である場合、MemberExpression
です。幸運なことに、それははるかに簡単に見ることができます:
MemberExpression : PrimaryExpression
o2
は確かにIdentifier
であるため問題ありません。o2
はMemberExpression
であり、したがってo2.foo
もMemberExpression
です。MemberExpression
は有効なAssignmentExpression
なので、o2.foo
はAssignmentExpression
にもなります。