复合 let/const 赋值是啥意思?

Posted

技术标签:

【中文标题】复合 let/const 赋值是啥意思?【英文标题】:What does compound let/const assignment mean?复合 let/const 赋值是什么意思? 【发布时间】:2016-04-08 07:32:03 【问题描述】:

在蓝鸟图书馆的wiki中有一篇文章Optimization killers。在这篇文章中有一句话:

目前无法优化: ... 包含复合 let 赋值的函数 包含复合 const 赋值的函数

复合 let 赋值和复合 const 赋值是什么意思? 在 ECMAScript 5.1 中有 compound assignment 的概念,但在 ECMAScript 2015 中,似乎没有任何复合赋值的概念,只有常规赋值。

我怀疑复合 let 和 const 赋值,它只是声明后的复合赋值。例如:

let n = 1;
n += 4;

我说的对吗?

【问题讨论】:

从复合的定义:“由两个或多个独立元素组成的东西;混合物。”由此看来,我认为let n = 1 + someval 是一个复合赋值,而let n = 1 不是?虽然不能绝对自信地说... 【参考方案1】:

是的,这似乎正是它的意思。我有以下代码(删除了无关的附加行):

function updatePlayer(player) 
    let direction = player.getDirection();
    if (player.isPressingLeft()) 
        direction += angleChange;
    
    if (player.isPressingRight()) 
        direction -= angleChange;
    
    player.setDirection(direction);

updatePlayer 在 Chrome 的 Profiles 选项卡中生成了一个警告,Not optimization: Unsupported let complex assignment,所以我尝试了 l = l + r 而不是 l += r 并得到了显着的、持续的性能改进。

jsPerf shows that let compound assignments are indeed extremely slow in Chrome 49.0.2623,与l = l + rvar 相比!我想这将在未来的版本中得到解决,因为 Firefox、IE11 和 Edge 都没有受到影响,而且 Google 显然知道这个问题。

【讨论】:

这似乎是对的,但是什么是“复合 const 赋值”,因为 const 声明不能重新赋值? 聚会迟到,但也可能意味着let x = 1, y = x; 而不是let x = 1; let y = x;。只是猜测。 为什么这仍然会扼杀优化?我一直在--trace_opt --trace_deopt 看到这个。像“+=”这样的复合赋值语句太简单也太方便了。

以上是关于复合 let/const 赋值是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中num/=10是啥意思

c语言中num是啥意思

var / let / const

let const 暂时性死区问题

let const 暂时性死区问题

var、function、let、const变量提升