2016-02-13 11 views
5

Wenn ich etwas tun, wie folgt aus:Ist die Reihenfolge der Ausführung von Operationen in Javascript garantiert immer gleich?

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

Der Unterschied in der zurückgegebene Wert zwischen (A) und (B) durch den Wert der x zu der Zeit erklärt wird ausgewertet wird. Ich vermute, dass hinter den Kulissen so etwas passieren soll:

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

Aber dies gilt nur dann, wenn und nur wenn x in den gleichen von links nach rechts ausgewertet wird, dass es geschrieben wurde.

Also, ich habe ein paar Fragen darüber,

Ist die garantiert für alle Javascript-Implementierungen um wahr zu sein?

Ist es vom Standard so definiert?

Oder ist dies eine Art von undefined Verhalten in Javascript-Welt?

Schließlich könnte die gleiche Idee angewendet werden, um Anrufe zu funktionieren,

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

Sie scheinen auch um ausgewertet zu werden, aber gibt es eine stärkere Garantie, dass dies immer passieren sollte?

+0

Hilft dies oder fragt Ihre Frage speziell nach der Ausführungsreihenfolge des Operators? http://StackOverflow.com/Questions/14863430/does-Javascript-have-undefined-behaviour –

+0

Ich frage besonders über garantierte/vorhersehbare Ausführungsreihenfolge. Aber das war eine nette Quelle, wusste nicht über diese Dinge. Vielen Dank. – almosnow

+1

Ich glaube, das sollte alle Fragen klären https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence – Hogan

Antwort

1

Ist dies für alle Javascript-Implementierungen garantiert?

Ja.

Ist es so definiert durch den Standard?

Ja, Sie können es selbst lesen here.

Spezifisch spezifiziert der runtime semantics: evaluation of the addition operator (+), dass der linke Ausdruck vor dem rechten Ausdruck ausgewertet wird.

Es ist das gleiche für die evaluation of argument lists.

Oder ist das eine Art von undefiniertem Verhalten in Javascript-Welt?

Ja, there is undefined behaviour in JavaScript, aber nicht hier.

Verwandte Themen