2016-02-13 11 views
5

Quando faccio qualcosa di simile:L'ordine di esecuzione delle operazioni in Javascript è sempre lo stesso?

var x = 5; 
console.log(  x + (x += 10) ); //(B) LOGS 10, X == 20 
console.log( (x += 10) + x  ); //(A) LOGS 0, X == 30 

La differenza nel valore restituito tra (A) e (B) si spiega con il valore della x nel momento in cui diventa valutato. Ho capito che qualcosa dietro le quinte come questo dovrebbe accadere:

 TIME ----> 
(A)   (x = 5) + (x += 10 = 15) = 20 
(B) (x += 10 == 15) + (x == 15)  = 30 

Ma questo è vero solo se e solo se x viene valutata nello stesso da sinistra a destra ordine che è stato scritto.

Così, ho alcune domande su questo,

È questo garantita per essere vero per tutte le implementazioni JavaScript?

È definito in questo modo dallo standard?

Oppure, questo è un tipo di comportamento non definito nel mondo Javascript?

Infine, la stessa idea potrebbe essere applicato a chiamate di funzione,

var x = 5; 
console.log(x += 5, x += 5, x += 5, x += 5); // LOGS 10, 15, 20, 25 

Inoltre sembrano essere valutato al fine , ma c'è la garanzia più forte che questo dovrebbe sempre accadere?

+0

Questo aiuto o la domanda specifica solo sull'ordine di esecuzione dell'operatore? http://stackoverflow.com/questions/14863430/does-javascript-have-undefined-behaviour –

+0

Sto chiedendo in particolare l'ordine di esecuzione garantito/prevedibile. Ma quella era una bella risorsa, non sapevo di quelle cose. Grazie. – almosnow

+1

Credo che questo dovrebbe chiarire qualsiasi domanda https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence – Hogan

risposta

1

È garantito questo per tutte le implementazioni Javascript?

Sì.

È definito in questo modo dallo standard?

Sì, è possibile leggere da soli here.

In particolare, lo runtime semantics: evaluation of the addition operator (+) specifica che l'espressione sinistra viene valutata prima dell'espressione corretta.

È lo stesso per lo evaluation of argument lists.

Oppure, si tratta di una sorta di comportamento non definito nel mondo Javascript?

Sì, there is undefined behaviour in JavaScript, ma non qui.

Problemi correlati