“let x = 0; x += 1” 和 “let x = 0; x = x + 1” 在语义上有区别吗?

3
考虑以下JavaScript代码片段:
let x = 0;
x += 1;

并且。
let x = 0;
x = x + 1;

这两个片段之间是否有任何有意义的区别?我之所以这样问,是因为第一个示例会防止Chrome优化包含它的函数,而第二个示例则不会。 此基准测试说明了在许多迭代中的性能差异。
至于我的原始问题,我想知道是否有任何语义上的区别,因为如果没有,我想知道为什么Chrome不会将复合赋值解析为x = x + 1形式。

你的基准测试结果并不太明显。那里的大多数示例都没有被读取(或传递),因此编译器可以优化掉大部分测试。特别是 x++,因为编译器可以轻松地证明你对其没有任何操作,所以可以被丢弃。 - ssube
所有样本在同一台机器上的速度完全相等(Chrome 56.0.2902 on Windows)。最大差异为3%,但大多数情况下彼此之间的差异小于1%。 - Tomalak
也许这可以帮助你:https://dev59.com/WGEi5IYBdhLWcg3wPKWx - Fernando Farias
这适用于Chrome 54,它是当前稳定版本。 - w.brian
1个回答

1
根据标准,它们在语义上是等价的。 运行时语义 的相关部分如下:
  1. op@= 中的 @
  2. 假定正在评估表达式 lval op rval,则将 op 应用于 lvalrval 的结果为 r
  3. 执行 ? PutValue(lref, r)

这两个片段之间是否有任何有意义的差别?

这两者之间不应该有任何可观察到的差异。

至于我的原始问题,我想知道是否有任何语义上的区别,因为如果没有,我想知道为什么 Chrome 不会将复合赋值简化为 x = x + 1 的形式。

优化是一个复杂的主题。let相对较新,并且尚未像var一样进行优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接