2016-01-04 4 views
23

В wiki библиотеки Bluebird есть статья Optimization killers. В этой статье есть фраза:Что означает соединение let/const?

В настоящее время не оптимизируемая:
...
Функции, которые содержат соединение пусть назначение
Функции, которые содержат назначение соединения константного

Что соединение 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 генерируется предупреждением, не оптимизирован: неподдерживаемый LET соединение назначения в Chrome в Профилях закладок, поэтому я попытался = ... + вместо += и получил значительное, последовательное улучшение производительности.

jsPerf shows that let compound assignments are indeed extremely slow in Chrome 49.0.2623, по сравнению с + ... = или var! Я предполагаю, что это будет исправлено в будущей версии, так как ни Firefox, ни IE11, ни Edge не пострадали, и, поскольку Google, очевидно, знает об этой проблеме.

+11

Это кажется правильным, но тогда что такое «составное' const'-присваивание », поскольку объявления' const' не могут быть повторно назначены? –

+0

Поздно к партии, но может также означать 'let x = 1, y = x;' вместо 'let x = 1; пусть y = x; '. Просто догадка. – Josh

+4

Почему heck делает это * все еще * убивает оптимизацию? Я вижу это в '-trace_opt -trace_deopt' все время. Сложные утверждения присваивания типа «+ =» слишком просты и слишком удобны. – TylerY86

Смежные вопросы