2010-07-22 13 views
13

proprio quando pensavo che ho capito qualcosa circa la conversione del tipo in JavaScript, mi sono imbattuto con questo:Perché un tipo di matrice vuoto converte a zero? + []

+[]; // 0 
Number([]); // 0 

Il mio primo pensiero è stato che dovrei ottenere NaN, proprio come se provo a convertire un oggetto vuoto al numero di:

+{}; // NaN 
Number({}); // NaN 

ho cercato su questo per un po 'senza alcun successo ...

qualcuno mi può spiegare perché viene convertito a 0 e non NaN?

Questo comportamento è standard?

Grazie.

risposta

19

In breve, vi sono due punti chiave:

Per esempio, possiamo utilizzare un oggetto che definisce un metodo toString, e restituisce una stringa vuota per avere un risultato equivalente:

var obj = { toString: function() { return "";} }; 
+obj; // 0 
Number(obj); // 0 

Questo comportamento è completamente di serie.

Ora la risposta lunga:

Sia, il unary plus operator e la Number constructor called as a function utilizzare internamente l'ToNumber operazione astratta.

ToNumber utilizzerà altre due operazioni interne, ToPrimitive e [[DefaultValue]].

Quando l'operazione ToNumber viene applicata ad un oggetto, ad esempio la matrice vuota nel tuo esempio, chiama l'operazione ToPrimitive, per ottenere un valore rappresentativo primitivo e chiamare ToNumber nuovamente utilizzando detto valore [1].

L'operazione ToPrimitive riceve due argomenti, un valore (che è l'oggetto matrice) e un tipo di suggerimento, che in questo caso è "Numero" poiché si desidera effettuare la conversione numerica.

ToPrimitive chiama il metodo interno [[DefaultValue]], anche con un tipo di suggerimento "Numero".

Ora, poiché il tipo di suggerimento si utilizza "Numero", il metodo interno [[DefaultValue]] ora proverà a richiamare prima il metodo valueOf sull'oggetto.

oggetti Array non hanno uno specifico metodo valueOf, il metodo è quello ereditato da Object.prototype.valueOf, e questo metodo restituisce semplicemente un riferimento all'oggetto stessa.

Poiché il metodo valueOf non ha determinato un valore di base , ora il metodo toString viene invocato, e produce una stringa vuota (che è un valore di base), allora l'operazione ToNumber proverà a fare String Conversione di numero e alla fine si finisce con 0[1].

Ma ora potresti chiedertelo, perché una stringa vuota costringe a zero?

+""; // 0 

C'è una grammatica completa che viene utilizzato quando il ToNumber internal operation is applied to a String type, il StringNumericLiteral produzione.

Ha alcune differenze tra un NumericLiteral, e una di queste differenze è che:

Uno StringNumericLiteral che è vuoto o contiene solo spazi vuoti viene convertito +0.

+2

+1 L'array è in realtà un tipo di oggetto in JavaScript, quindi ha un metodo toString(). – BoltClock

Problemi correlati