在C#中,
string s = "abc";
s += (s += s);
Console.WriteLine(s);
写abcabcabc
(http://ideone.com/pFNFX2)。这很好,因为C#规范明确在7.16.2节中说明了
操作被评估为x = x op y,除了x仅被评估一次。
但是,在阅读ECMAScript 5.1语言规范第11.3.2节中对复合赋值运算符的描述时,我在这个运算符的语义中看不到这样的“只有一次”限定符。相反,我所看到的只是:
- 让lref成为评估LeftHandSideExpression的结果。
- 让lval成为GetValue(lref)。
- 让rref成为评估AssignmentExpression的结果。
- 让rval为GetValue(rref)。
- 设r是将operator @应用于lval和rval的结果。
- 如果满足以下条件,则抛出SyntaxError异常:(剪切)
- 调用PutValue(lref,r)。
- 返回r。
醇>
因此,对我来说,无论如何都会出现以下JavaScript代码
var s = "abc";
s += (s += s);
alert(s);
会提醒abcabcabcabc
(因为带括号的表达式中第7行的PutValue),但是,无论如何,它都会在Chrome 22中发出警告abcabcabc
。
所以我的问题是:我是误读了规范,还是Chrome(可能是V8?)做了不合适的事情,可以这么说?
答案 0 :(得分:4)
所以我认为如果你打开这个操作,你有:
s += (s += s);
s = s + (s += s);
s = s + (s = s + s); // Can't actually have the "s = " part, it's really just "s + s"
s = s + (s + s);
s = s + s + s;
这意味着结果应该是“abcabcabc”。