In C#,
string s = "abc";
s += (s += s);
Console.WriteLine(s);
пишет abcabcabc
(http://ideone.com/pFNFX2). Это нормально, потому что спецификация C# прямо говорит в разделе 7.16.2, что
операция оценивается как x = x op y, за исключением того, что x оценивается только один раз.
Однако, читая описание составного оператора присваивания в разделе 11.3.2 Спецификации языка ECMAScript 5.1, я не вижу такого квалификатора «только один раз» в семантике этого оператора. Вместо этого я вижу только:
- Пусть lref будет результатом вычисления LeftHandSideExpression.
- Пусть lval будет GetValue(lref).
- Пусть rref будет результатом оценки AssignmentExpression.
- Пусть rval будет GetValue(rref).
- Пусть r будет результатом применения оператора @ к lval и rval.
- Вызовите исключение SyntaxError, если выполняются все следующие условия: (отрезано)
- Вызовите PutValue(lref, r).
- Возврат р.
Поэтому может показаться (во всяком случае мне), что следующий код JavaScript
var s = "abc";
s += (s += s);
alert(s);
будет предупреждать abcabcabcabc
(из-за PutValue в строке 7 в выражении в скобках), но в любом случае в Chrome 22 он предупреждает abcabcabc
.
Итак, мой вопрос: я неправильно понимаю спецификацию, или Chrome (возможно, V8?) делает что-то нестандартное, так сказать?
s += (s += s);
, оно станетs = s + (s + s);
, и я думаю, что это достаточно просто, чтобы сказать, что результат должен быть abcabcabc - person Ian   schedule 28.10.2012