Domanda

JavaScript fa conversioni automatiche funky con gli oggetti:

var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));

stamperà:

4040
40140
120

Questo perché +, se uno qualsiasi degli argomenti sono oggetti / stringhe, cercheranno di convertire tutti gli argomenti in stringhe poi concatenare. Se tutti gli argomenti sono numeri, li somma. * E unario + convertire gli oggetti ai numeri utilizzando toString (così come valueOf, non mostrato qui).

Che cosa significa fare JavaScript per l'operatore ++?

È stato utile?

Soluzione

specifica del linguaggio ECMAScript

  

11.3 Postfix Espressioni

     

Sintassi

     

PostfixExpression:

     
      
  • LeftHandSideExpression
  •   
  • LeftHandSideExpression [no LineTerminator qui] ++
  •   
  • LeftHandSideExpression [no LineTerminator qui] -
  •   
     

11.3.1 Postfix Increment Operatore

     

La produzione PostfixExpression:   LeftHandSideExpression [no   LineTerminator qui] ++ è valutato   come segue:

     
      
  1. Valutare LeftHandSideExpression.
  2.   
  3. Chiama GetValue (Risultato (1)).
  4.   
  5. Chiama ToNumber (Risultato (2)).
  6.   
  7. Aggiungi il valore 1 al risultato (3), utilizzando le stesse regole per l'operatore +   (Sezione 11.6.3).
  8.   
  9. Chiama PutValue (Risultato (1), Risultato (4)).
  10.   
  11. Risultato di ritorno (3).
  12.   

Questa è pseudo codice javascript di come funziona postInc:

function postInc(a) {
  var x = +a; // Converts a to a number, Section 11.4.6 Unary + Operator
  a = x + 1;
  return x;
}

Edit: Come mikesamuel ha detto: non è parseInt. Aggiornato per riflettere questo.

Altri suggerimenti

Il codice seguente illustra bene questo:

var a = {toString: function() {return "40"; }};
nl(typeof a);
nl(typeof +a);
nl(typeof a);
nl(typeof (a++));
nl(a);
nl(typeof a);

L'output è:

object
number
object
number
41
number

Più unario converte l'oggetto in un numero e non modificarlo. un primo ++ converte l'oggetto in un numero, quindi torna quel numero , e quindi incrementa il numero, memorizzare il valore in una.

Questo si oppone ad un'altra possibile soluzione, in cui un primo ++ sarebbe restituire l'oggetto, e quindi eseguire la conversione di un numero e incrementazione.

L'operatore ++ esegue una conversione "ToNumber" (sostanzialmente una combinazione di regole di tipo e la funzione valueOf). Fondamentalmente per risolvere qualsiasi espressione

 resolveExpression++

I passi compiuti dal motore JS sono

 <temp> = toNumber(resolveExpression);
 resolveExpression = <temp> + 1;
 <result> = <temp>

Per le espressioni risolvere i non-atomiche, ad esempio. base.resolve++ o base["resolve"]++, ecc base è stato risolto solo una volta e poi riutilizzati. In ogni caso questo sano è irrilevante, tuttavia è importante se il valore di essere incrementato è un oggetto con un'implementazione valueOf che cambia l'oggetto base.

ad es.

base = {};
base.value = {valueOf:function(){base = {}; return 5;}}
base.value++;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top