2016-01-04 81 views
23

在Bluebird图书馆的wiki中有一篇文章Optimization killers。在这篇文章中有这样一句话:复合let/const赋值是什么意思?

目前不可优化:含有一种化合物让含有一种化合物常量分配分配
功能
...
功能

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

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

let n = 1; 
n += 4; 

对吗?

+0

根据化合物的定义:“由两个或多个单独元素组成的物质;混合物”。从那以后,我会认为'让n = 1 + someval'是一个复合赋值,'let n = 1'不是?尽管......绝对没有绝对的信心说...... – AdamJeffers

回答

15

是的,这似乎正是它的意思。我有以下代码(不相关的其他行删除):

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

updatePlayer发生了警告,没有得到优化:不支持让复合赋值,在Chrome的型材标签,所以我尝试= ... +,而不是+=,得到了显着的,一致的性能改进。

jsPerf shows that let compound assignments are indeed extremely slow in Chrome 49.0.2623,与+ ... =var相比较!我想这将在未来版本中得到修复,因为Firefox,IE11和Edge都不受影响,并且谷歌显然知道这个问题。

+11

这似乎是正确的,但是由于'const'声明不能被重新赋值,所以什么是“复合const”赋值? –

+0

晚会,但也可能意味着'let x = 1,y = x;'而不是'let x = 1;让y = x;'。只是一个猜测。 – Josh

+4

为什么这个*仍然*杀死优化?我总是在'--trace_opt --trace_deopt'中看到这个。像“+ =”这样的复合赋值语句太简单,太方便了。 – TylerY86