Come funziona JavaScript trattare l'operatore ++?
-
23-08-2019 - |
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 ++?
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:
- Valutare LeftHandSideExpression.
- Chiama GetValue (Risultato (1)).
- Chiama ToNumber (Risultato (2)).
- Aggiungi il valore 1 al risultato (3), utilizzando le stesse regole per l'operatore + (Sezione 11.6.3).
- Chiama PutValue (Risultato (1), Risultato (4)).
- Risultato di ritorno (3).
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++;