标签: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节中说过
the operation is evaluated as x = x op y, except that x is evaluated only once.
但是,在阅读ECMAScript 5.1语言规范第11.3.2节中对复合赋值运算符的描述时,我在这个运算符的语义中看不到这样的“只有一次”限定符.相反,我所看到的只是:
- Let lref be the result of evaluating LeftHandSideExpression.
- Let lval be GetValue(lref).
- Let rref be the result of evaluating AssignmentExpression.
- Let rval be GetValue(rref).
- Let r be the result of applying operator @ to lval and rval.
- Throw a SyntaxError exception if the following conditions are all true: (snipped)
- Call PutValue(lref, r).
- Return r.
因此,对我来说,无论如何都会出现以下JavaScript代码
var s = "abc";
s += (s += s);
alert(s);
会提醒abcabcabcabc(因为带括号的表达式中的第7行上的PutValue),但是,无论如何,它都会在Chrome 22中警告abcabcabc.
所以我的问题是:我是否误读了规范,或者Chrome(也许是V8?)做了不合适的事情,可以这么说?
解决方法:
所以我想如果你打开这个操作,你有:
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”.
标签:javascript,ecmascript-5,side-effects,compound-assignment 来源: https://codeday.me/bug/20190625/1287741.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。