Perché l’operatore aritmetico di stenografia ++ dopo il nome della variabile non restituisce 2 nella seguente istruzione?

Ho un operatore aritmetico molto semplice ma sono alla mia intelligenza perché non ritorna 2. Il codice qui sotto restituisce 1. Ho pensato che x ++ equivale a x = x + 1;

CODICE

var x = 1; document.write(x++); 

Tuttavia se eseguo il codice come segue, restituisce 2 come previsto

CODICE

 var x = 1; document.write(++x); 

Che cosa sto facendo di sbagliato?

PostIncrement (variabile ++) e PostDecrement (variabile–)

Quando si utilizza l’operatore ++ o -- dopo la variabile, il valore della variabile non viene incrementato / decrementato finché non viene valutata l’espressione e viene restituito il valore originale. Ad esempio x++ traduce in qualcosa di simile al seguente:

 document.write(x); x += 1; 

PreIncrement (++ variabile) e PreDecrement (- variabile)

Quando si utilizza l’operatore ++ o -- prima della variabile, il valore della variabile viene incrementato / decrementato prima che l’espressione venga valutata e venga restituito il nuovo valore. Ad esempio, ++x traduce in qualcosa di simile al seguente:

 x += 1; document.write(x); 

Gli operatori di postincremento e preincremento sono disponibili in C, C ++, C #, Java, javascript, php, e sono sicuro che ci siano altre lingue. Secondo il perché-non-ruby-support-i-or-i-increment-decrement-operatori , Ruby non ha questi operatori.

Penso a x++ e ++x (informalmente) come questo:

x++ :

 function post_increment(x) { return x; // Pretend this return statement doesn't exit the function x = x + 1; } 

++x :

 function pre_increment(x) { x = x + 1; return x; } 

Le due operazioni fanno la stessa cosa, ma restituiscono valori diversi:

 var x = 1; var y = 1; x++; // This returned 1 ++y; // This returned 2 console.log(x == y); // true because both were incremented in the end 

Se dai un’occhiata alle specifiche javascript delle pagine 70 e 71 puoi vedere come dovrebbe essere implementato:

Prefisso:

  1. Lascia che espr sia il risultato della valutazione di UnaryExpression.
  2. Genera un’eccezione SyntaxError se le seguenti condizioni sono tutte vere: 72 © Ecma International 2011
    • Digitare (espr) è Riferimento è vero
    • IsStrictReference (expr) è vero
    • Type (GetBase (expr)) è Environment Record
    • GetReferencedName (expr) è “eval” o “argomenti”
  3. Sia oldValue be ToNumber (GetValue (expr)).
  4. Sia newValue il risultato dell’aggiunta del valore 1 a oldValue, utilizzando le stesse regole dell’operatore + (vedere 11.6.3).
  5. Chiama PutValue (expr, newValue).
  6. Restituisce newValue.

O più semplicemente:

  1. Valore di incremento
  2. Valore di ritorno

Postfix:

  1. Lascia che sia il risultato della valutazione di LeftHandSideExpression.
  2. Genera un’eccezione SyntaxError se le seguenti condizioni sono tutte vere:
    • Tipo (lhs) è Riferimento è vero
    • IsStrictReference (lhs) è vero
    • Type (GetBase (lhs)) è Environment Record
    • GetReferencedName (lhs) è “eval” o “argomenti”
  3. Sia oldValue be ToNumber (GetValue (lhs)).
  4. Sia newValue il risultato dell’aggiunta del valore 1 a oldValue, utilizzando le stesse regole dell’operatore + (vedere 11.6.3).
  5. Chiama PutValue (lhs, newValue).
  6. Restituisce oldValue.

O più semplicemente:

  1. Assegna valore a temp
  2. Valore di incremento
  3. Ritorno temp