C#では、
string s = "abc";
s += (s += s);
Console.WriteLine(s);
書き込みabcabcabc
(http://ideone.com/pFNFX2)。C#仕様では、セクション7.16.2で次のように明示的に記述されているため、これは問題ありません。
xが1回だけ評価されることを除いて、操作はx = xopyとして評価されます。
ただし、ECMAScript 5.1言語仕様のセクション11.3.2にある複合代入演算子の説明を読んでいると、この演算子のセマンティクスにそのような「1回だけ」の修飾子がありません。代わりに、私が見るのは次のとおりです。
- lrefをLeftHandSideExpressionの評価結果とします。
- lvalをGetValue(lref)とします。
- rrefをAssignmentExpressionの評価結果とします。
- rvalをGetValue(rref)とします。
- rをlvalとrvalに演算子@を適用した結果とします。
- 次の条件がすべて当てはまる場合は、SyntaxError例外をスローします。(snipped)
- PutValue(lref、r)を呼び出します。
- rを返します。
したがって、(とにかく)次のJavaScriptコードが表示されます
var s = "abc";
s += (s += s);
alert(s);
警告abcabcabcabc
しますが(括弧で囲まれた式の7行目のPutValueのため)、とにかくChrome22では警告しabcabcabc
ます。
だから私の質問は:私は仕様を読み間違えているのか、それともChrome(V8はおそらく?)が独自のことを仕様外で行っているのか?