在JavaScript中链接复合赋值运算符

时间:2012-10-28 06:00:10

标签: javascript ecmascript-5 side-effects compound-assignment

在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节中对复合赋值运算符的描述时,我在这个运算符的语义中看不到这样的“只有一次”限定符。相反,我所看到的只是:

  
      
  1. 让lref成为评估LeftHandSideExpression的结果。
  2.   
  3. 让lval成为GetValue(lref)。
  4.   
  5. 让rref成为评估AssignmentExpression的结果。
  6.   
  7. 让rval为GetValue(rref)。
  8.   
  9. 设r是将operator @应用于lval和rval的结果。
  10.   
  11. 如果满足以下条件,则抛出SyntaxError异常:(剪切)
  12.   
  13. 调用PutValue(lref,r)。
  14.   
  15. 返回r。
  16.   

因此,对我来说,无论如何都会出现以下JavaScript代码

var s = "abc";
s += (s += s);
alert(s);

会提醒abcabcabcabc(因为带括号的表达式中第7行的PutValue),但是,无论如何,它都会在Chrome 22中发出警告abcabcabc

所以我的问题是:我是误读了规范,还是Chrome(可能是V8?)做​​了不合适的事情,可以这么说?

1 个答案:

答案 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”。