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.
+1 L'array è in realtà un tipo di oggetto in JavaScript, quindi ha un metodo toString(). – BoltClock