2016-09-26 3 views
-2

Ich versuche, diese Magie in js zu lösen:Js Magie braucht Erklärung

var a = 1; 
console.log(a++ + ++a); 

Es gibt 4 zurück, und ich kann verstehen, dass es 1 + 3, aber was ist die Folge davon?

+4

wenn Sie verstehen, was Nachinkrement und Prä-Inkrement Betreiber tun, wird es ziemlich offensichtlich. Sie müssen nur die Dokumente lesen und wissen, dass Code von links nach rechts ausgeführt wird. – Xufox

+0

Ich mache es noch nicht offensichtlich. Kannst du es einfach beschreiben wie 1) ... 2) ... 3) ... in deiner Antwort? –

+2

@Jonasw Was hat '2 + 2' damit zu tun? – Xufox

Antwort

5

a++ Mittel den Wert zurück, bevor Erhöhen

++a bedeutet kehrt der Wert nach

Erhöhen

So um Ihr Beispiel zu brechen:

var a = 1; 
console.log(a++ + ++a); 
  1. a wird auf 1
  2. a++ gibt 1 zurück, und dann a wird erhöht, um 2 (aber wir tun nichts mit ihm an dieser Stelle)
  3. ++a Schritten a und gibt 3
  4. Dann haben wir insgesamt console.log(1 + 3) mit der 1 kommt aus Schritt 1 und der 3 kommt aus Schritt 3.
1

Um etwas genauer auf das, was Xufox was saying in the comments section gehen in:

++a ersten Schritten der Wert ein und gibt dann ein L-Wert auf einen Bezug genommen wird, so dass, wenn der Wert von a dann verwendet wird, wird es der erhöhte Wert sein .

a++ gibt zuerst einen rvalue zurück, dessen Wert a ist, dh der alte Wert, und erhöht dann a zu einer unbestimmten Zeit vor dem nächsten vollständigen Ausdruck (d. H. "Vor dem Semikolon").

Das Postfix-Inkrement hat eine höhere Priorität als das Präfix-Inkrement.

Das half mir viel zurück in den Tag, und es sollte auch Ihnen helfen ..

http://en.cppreference.com/w/cpp/language/operator_incdec

3

, was die Sequenz dieses

In Pseudo-spec Sprache

ist:

  1. auswerten Zusatz (a++ + ++a)
    1. Lassen lval das Ergebnis des linken Operanden Auswertung (a++)
      1. Holen Sie den Wert a und weisen Sie ihn oldValue zu. (1)
      2. Lassen Sie newValueoldValue + 1 sein.
      3. Zuweisen newValue zu a.(a == 2)
      4. Zurück oldValue. (1)
    2. Let rval das Ergebnis des rechten Operanden Auswertung (++a)
      1. den Wert von a bekommen und es zu oldValue zuweisen. (2)
      2. Lassen Sie newValueoldValue + 1 sein.
      3. Zuweisen newValue zu a. (a == 3)
      4. Zurück newValue. (3)
    3. Zurück lval + rval. (1 + 3)
  2. Ergebnis: 4