2016-01-04 9 views
23

C'è un articolo Optimization killers nella wiki della biblioteca Bluebird. In questo articolo v'è una frase:Che cosa significa assegnazione di let/const composta?

Non ottimizzabile:
...
funzioni che contengono un composto lasciare assegnazione
funzioni che contengono un'assegnazione composta const

Cosa fa il composto lascia l'assegnazione e l'assegnazione del const composto? In ECMAScript 5.1 c'era la nozione di compound assignment ma in ECMAScript 2015, sembra che non ci sia alcuna nozione di assegnazioni composte, ci sono solo assegnazioni regolari.

Ho il sospetto che l'assegnazione composta di let e const è solo un'assegnazione composta dopo la dichiarazione. Ad esempio:

let n = 1; 
n += 4; 

Ho ragione?

+0

Dalla definizione di composto: "una cosa composta da due o più elementi separati, una miscela". Da ciò, penserei che "let n = 1 + someval' è un compito composto e" let n = 1' non lo è? Non posso dire con assoluta sicurezza però ... – AdamJeffers

risposta

15

Sì, sembra essere esattamente ciò che significa. Ho avuto il seguente codice (aggiungere altre righe irrilevanti rimosse):

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

updatePlayer generato un avviso, non ottimizzato: let non supportato assegnazione composta, in Chrome Profili tab, così ho provato = ... + invece di += e ottenuto un miglioramento significativo e consistente delle prestazioni.

jsPerf shows that let compound assignments are indeed extremely slow in Chrome 49.0.2623, rispetto a + ... = o var! Immagino che questo sarà risolto in una versione futura, dal momento che né Firefox né IE11 né Edge sono interessati, e dal momento che Google sembra conoscere il problema.

+11

Questo sembra giusto, ma allora che cos'è un "composto' const' assignment ", dal momento che le dichiarazioni di' const' non possono essere riassegnate? –

+0

In ritardo fino alla festa, ma potrebbe anche significare 'lascia x = 1, y = x;' invece di 'lascia x = 1; sia y = x; '. Solo una supposizione. – Josh

+4

Perché diavolo fa questo * ancora * uccide l'ottimizzazione? Lo vedo in '--trace_opt --trace_deopt' tutto il tempo. Affermazioni di assegnazione composte come "+ =" sono troppo semplici e troppo convenienti. – TylerY86